假设我正在为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()?
不要担心是否触发dealloc()。它的确如此,但那不是重点。关键是[自释放]平衡了早期调用+ alloc,因此所有您需要的版本都已完成,现在系统将在适当的时候处理重新分配。在大多数情况下,一旦[自我释放]被调用,“适当的时间”就有可能,但如果有任何未决的自动释放,它可能会晚一些。但上面的代码是正确的,没有其他要求。 – 2010-01-07 18:17:31
附注:根据我的理解,calloc/malloc永远不会返回NULL,当内存不足或系统内存不足时,系统只会杀死您的应用程序。我想苹果认为这样做更容易,然后应用程序崩溃从未检查的NULL /零指针。 – 2011-11-29 21:23:53