隨着後續各種各樣的到Is returning nil from a [[class alloc] init] considered good practice?,還有,我還沒有看到任何討論比較多的情況下:做什麼用的,以前失敗的一些前提條件一個init可以調用下一個init?跟帖從返回nil [類的alloc]初始化]
例如,假設在此initWithStuff:方法被傳遞nil或通常沒有值傳遞給initWithValue:是一個絕對失敗,我們肯定要返回nil。
- (id)initWithStuff:(Stuff *)inStuff {
if (!inStuff || ![inStuff hasValidValue])
{
// can't proceed to call initWithValue: because we have no value
// so do what?
return nil;
}
NSInteger value = [inStuff integerValue];
return [super initWithValue:value];
}
也許更清楚的例子是,如果我們包裹指定初始化方法採用一個對象的指針,並拋出如果其通過零個例外。我們肯定需要將導致異常的init調用短路。
我的猜測:init以任何方式可能,只有在返回nil之前釋放自己。如有必要,在釋放之前,調用裸啓動器或任何其他初始化器,以使自己進入已知狀態。
// can't proceed to call super's initWithValue: because we have no value
// so do what? do this:
self = [super init]; // or initWithValue:0
[self release];
return nil;
如果沒有這樣的初始化,將沒有有效數據的工作,我想人們會需要構建一些有效的,虛擬數據。或者抱怨它的作者,直到然後就返回零,並與泄漏住:^)
此外,如何ARC影響的情況呢?
我的猜測:仍然以任何可能的方式完成init,然後返回nil。你會認爲設置自我可能是多餘的,但在某些情況下並非如此。在任何情況下,它都需要在那裏靜默編譯器警告。
// can't proceed to call super's initWithValue: because we have no value
// so do what? do this:
self = [super init]; // finish init so ARC can release it having no strong references
return nil;
我的猜測是錯誤的嗎?
這是如何不泄漏alloc_d內存的可能對象? –
@smallduck我想到了這一些,並修改了我的答案。 –