Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我应该在非指定初始化器中失败后自动释放吗?_Objective C - Fatal编程技术网

Objective c 我应该在非指定初始化器中失败后自动释放吗?

Objective c 我应该在非指定初始化器中失败后自动释放吗?,objective-c,Objective C,假设我有以下课程: @interface Frob : NSObject { NSData *data; } - (id)initWithData:(NSData *)inData; @end @implementation Frob - (id)initWithData:(NSData *)inData { if ((self = [super init])) { data = [inData retain]; } return self; } -

假设我有以下课程:

@interface Frob : NSObject {
    NSData *data;
}
- (id)initWithData:(NSData *)inData;
@end

@implementation Frob
- (id)initWithData:(NSData *)inData 
{
   if ((self = [super init])) {
       data = [inData retain];
   }
   return self;
}
- (void)dealloc
{
    [data release];
    [super dealloc];
}
@end
现在我想添加一个方便的方法来读取URL。所以我写了这样的东西:

- (id)initWithContentsOfURL:(NSURL *)url
{
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL:URL options:0 error:&error];
    if (!data) {
        NSLog(@"Frob couldn't read data, error: %@", error);
        [self autorelease]; // !!!
        return nil;
    }
    return [self initWithData:data];
}
行为我升起了一个红旗:我(有效地)在一个对象上调用了
-release
,该对象已被
+alloc
'd,但超类的
-init
从未被实际调用。这安全吗

问同样问题的另一种方式是:从概念上讲,
-release
是否与
+alloc
相反?还是属于
+alloc
-[init]


非常感谢您的澄清。

这很好,因为在返回nil后,您的对象将没有句柄。如果有什么问题,你应该做一个释放,而不是自动释放。你会发现,
[nil release]
是一个不可操作的事实,因为超类还没有初始化,所以它中没有任何东西是非nil的

问同样问题的另一种方式是:从概念上讲,-release与+alloc相反吗?还是+alloc和-[init]

不,这在概念上不是相反的。然而,从概念上讲,alloc执行retain,它与release相反,当初始化失败时,您的release将撤消retain


请注意,由于init中的发布,将调用dealloc,因此dealloc需要使用部分(或根本不)初始化的对象。在您的情况下,调用dealloc时,您的实例变量都将为nil/NULL/0/false。

“因此dealloc需要处理部分(或根本不)初始化的对象”这是我的主要问题,真的吗?@Colin Barrett:是的。然而,它并不像你想象的那么糟糕。所有未初始化的Objective-C对象IVAR都将为nil,将释放发送到nil是完全安全的。