一般情况下,如果在初始化过程中发生错误,我们应该调用[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.