2010-01-06 32 views
24

假设我正在为Objective-C中的iPhone构建一个新类。在我的一个init方法中,我想手动分配一些内存。所以,我可能有这样的事情:我应该如何在Objective-C的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()可能会失败,而且失败的分配内存是灾难性的。我的目标,我应该怎么做,如果体内部,以便清洗正确吗?是否有我应该使用的Objective-C习惯用法或模式?

编辑:我收录了Rob Napier发布的代码。但是,我仍然必须释放myObject,对吧?或者添加的代码以某种方式触发dealloc()?

+2

不要担心是否触发dealloc()。它的确如此,但那不是重点。关键是[自释放]平衡了早期调用+ alloc,因此所有您需要的版本都已完成,现在系统将在适当的时候处理重新分配。在大多数情况下,一旦[自我释放]被调用,“适当的时间”就有可能,但如果有任何未决的自动释放,它可能会晚一些。但上面的代码是正确的,没有其他要求。 – 2010-01-07 18:17:31

+0

附注:根据我的理解,calloc/malloc永远不会返回NULL,当内存不足或系统内存不足时,系统只会杀死您的应用程序。我想苹果认为这样做更容易,然后应用程序崩溃从未检查的NULL /零指针。 – 2011-11-29 21:23:53

回答

26

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

[self release]; 
self = nil; 

请参阅Issues with Initializers“Objective-C编程指南”中的概念。

3

您需要清理任何需要的东西,然后将自我引用设置为nil。苹果开发门户网站有一篇文章:

Link

+0

geez - 至少发表评论,当你downvote! – psychotik 2010-01-06 22:35:56

+0

不要忘了释放自己,否则你会泄漏。 (不知道谁低调;你是对的)。 – 2010-01-06 22:36:50

1

我只是尝试。 -dealloc被叫[self release],所以myObject将不需要在initWithSomeObject发布。可以肯定的是,您可能会在可能失败的呼叫下面(如果可能的话)移动myObject = [someObject retain];(我更喜欢那种风格,以防-retain可能因某种原因失败)。

相关问题