簡體   English   中英

在Objective-C中,如何處理[[myView alloc] init]返回nil?

[英]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;
}

以及,如果基礎重新分配selfinit ,然后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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM