类初始化失败该如何处理

时间:2021-08-10 17:28:55

一般情况下,如果在初始化过程中发生错误,我们应该调用[Self Release]并返回nil空对象。这样的话,我们就需要注意以下两个问题:

1)任何类,无论是你自己创建的类,子类或者外部调用的方法,当遇到初始化方法返回nil时应当知道如何处理它。比较少见的情况是,如果调用类或方法在初始化这个类之前已经创建了对该类的引用,就应当停止对这个类的引用。

2)同时,你必须保证调用dealloc方法对于只是初始化一半的当前类足够安全。

要注意的是,在初始化失败的时候,你只能调用[self release]方法。如果你发现调用父类构造函数失败时,你就不能调用release方法了。正确的做法是简单的释放所有引用并返回nil。一般在你的初始化代码中应当包含对父类初始化返回值的判断。请参考下面的一个例子:

- (id)init {

self = [super init];
if (self) {

creationDate = [[NSDate alloc] init];

}
return self;

}

下面的例子则显示如何处理初始化函数传入参数非法的情况

- (id)initWithImage:(NSImage *)anImage {

if (anImage == nil) {

[self release];

return nil;

}
// 获得传入NSImage对象的大小

NSSize size = anImage.size;
NSRect frame = NSMakeRect(0.0, 0.0, size.width, size.height);
// 将父类初始化返回值赋予self
self = [super initWithFrame:frame];
if (self) {

image = [anImage retain];

}
return self;

}

另外一个例子展示了一个很好的方法,我们可以使用NSError对象的一个引用来返回详细的错误信息。

- (id)initWithURL:(NSURL *)aURL error:(NSError **)errorPtr {

self = [super init];
if (self) {

NSData *data = [[NSData alloc] initWithContentsOfURL:aURL

options:NSUncachedRead error:errorPtr];

if (data == nil) {

// 这时一个NSError对象会在NSData的初始化方法中创建。

[self release];
return nil;

}
// 其它初始化代码...

}

return self;

}

以上翻译自'The Objective-C Programming Language' of Apple Inc.