[英]In Objective-C, how to deal with [[myView alloc] init] returning nil?
似乎在書的代碼示例中,始終定義init
以便仔細檢查self
是否能夠存在。
-(id) init {
self = [super init];
if (self) {
// initialize
}
return self;
}
但是,在返回時,根本沒有代碼檢查對象是否能夠存在。 但它應該檢查,如何處理? 如果對象不存在,那是否意味着系統嚴重缺乏內存,甚至彈出錯誤信息也是不可能的?
但是,在返回時,根本沒有代碼檢查對象是否能夠存在。 但它應該檢查,如何處理?
通常,返回nil
時,子類會忽略錯誤處理。 返回nil
時,錯誤處理通常留給調用者。 正如慣用語-init
:
- (id)init {
self = [super init];
if (self) {
// initialize
}
return self;
}
以及,如果基礎重新分配self
中init
,然后self
被重新分配( self = [super init];
效果很好。
如果你沒有將self
分配給super
的初始化程序的結果,或者如果你沒有檢查nil
,那么你可能會持有一個懸空/解除分配的指針( EXC_BAD_ACCESS
),你可能無法正確初始化你的ivars(你會如果沒有遇到EXC_BAD_ACCESS
則有效地將它們分配給另一個區域。
這兩個案例更詳細:
不能分配自己
- (id)init {
[super init];
if (self) {
// self was not reassigned. if super returned an object other
// than self, then our ivar would be freed, reused, or sitting
// in an autorelease pool, and the returned instance's ivar
// would not be assigned -- we wouldn't know the address.
ivar = 1;
}
return self;
}
未能檢查無
- (id)init {
self = [super init];
// super returned nil. ivar is an invalid region:
ivar = 1;
return self;
}
是的,我已經看到了這兩個。
如果對象不存在,那是否意味着系統嚴重缺乏內存,甚至彈出錯誤信息也是不可能的?
一點也不。 許多初始值設定項返回nil
表示“在此上下文中不能執行”,或者如果存在簡單的參數錯誤。
這是否意味着系統嚴重缺乏內存
否。分配內存失敗通常會導致+ alloc失敗,而不是-init。
實際上,沒有參數的init方法失敗是非常罕見的。 如果你傳遞了無效的參數,通常init方法可以返回nil,例如NSString的-initWithContentsOfFile:如果它無法加載應該初始化的文件路徑的內容,則可以返回nil。
如果您意識到init失敗的可能性很大,那么您可能需要檢查它,否則,您應該繼續使用該對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.