Iphone 我应该如何处理Objective-C中init:method中的失败?

Iphone 我应该如何处理Objective-C中init:method中的失败?,iphone,objective-c,cocoa-design-patterns,Iphone,Objective C,Cocoa Design Patterns,假设我正在Objective-C中为iPhone构建一个新类。在我的一个init方法中,我想手动分配一些内存。所以,我可能有这样的想法: - (id)initWithSomeObject:(SomeObject *)someObject { self = [super init]; if (self != nil) { myObject = someObject; [myObject retain]; if ( (memory = calloc(1, sizeof

假设我正在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体内做些什么来正确清理呢?我是否应该使用Objective-C习惯用法或模式


编辑:我包括罗布·纳皮尔发布的代码。但是,我还是要释放myObject,对吗?或者添加的代码是否会以某种方式触发dealloc()?

是的,您应该释放自己,然后返回
nil

[self release];
self = nil;

请参见Objective-C编程指南中的概念。

您需要清理任何需要清理的内容,然后将自引用设置为
nil
。Apple Dev Portal有一篇文章:


我刚试过
-dealloc
由于
[自我释放]
而被调用,因此
myObject
不需要在
initWithSomeObject
中被释放。当然,您可以移动
myObject=[someobjectretain](我更喜欢那种风格,以防
-retain
可能由于某种原因失败)低于可能失败的调用(如果可能的话)。

别忘了释放self,否则你会泄漏。(不知道谁投了反对票;你是对的)。不要担心它是否会触发dealloc()。是的,但这不是重点。关键是,[self release]平衡了先前对+alloc的调用,因此您所需的所有发布都已完成,系统现在将在适当的时间处理释放。在大多数情况下,“适当的时间”很可能在调用[self release]之后,但如果有任何未决的自动释放,则可能是稍后。但是上面的代码是正确的,不需要其他任何东西。作为旁注:我的理解是calloc/malloc永远不会返回NULL,当你的应用程序内存耗尽或不足时,系统只会终止你的应用程序。我猜苹果认为这样做更容易,然后让应用程序从未检查的空/零指针崩溃。