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是完全安全的。