假设我在Objective-C中为iPhone构建一个新类。在我的一个init方法中,我想手动分配一些内存。所以,我可能会有这样的事情:
- (id)initWithSomeObject:(SomeObject *)someObject {
self = [super init];
if (self != nil) {
myObject = someObject;
[myObject retain];
if ( (memory = calloc(1, sizeof(SomeStruct)) == NULL) {
// What should I do here to clean up
[self release];
self = nil;
}
}
return self;
}
现在,假设calloc()可能失败,并且无法分配内存对我的对象来说是灾难性的,我应该在if-body内做什么来正确清理?是否存在我应该使用的Objective-C习语或模式?
编辑:我收录了Rob Napier发布的代码。但是,我还是要释放myObject,对吧?或者添加的代码是否以某种方式触发dealloc()?
答案 0 :(得分:26)
答案 1 :(得分:3)
您需要清理所需的任何内容,然后将自引用设置为nil
。 Apple Dev Portal有一篇文章:
答案 2 :(得分:1)
我刚试过。 -dealloc
因[self release]
而被调用myObject
,因此initWithSomeObject
无法在myObject = [someObject retain];
中释放-retain
。可以肯定的是,您可能会在可能失败的调用(如果可能的话)之下移动{{1}}(我希望{{1}}可能因某种原因失败的风格)。