类初始化失败该如何处理

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

转载于:https://www.cnblogs.com/iearth/archive/2011/02/11/1951390.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值