2014-03-24 89 views
4

我開始研究我們的前輩完成的代碼,我發現init方法總是有代碼-(id)init方法。他們用以下方式使用代碼。下面的代碼用於所有viewControllers。如果我們不在init方法中檢查「if(self)」會發生什麼?

self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]]; 
    return self; 

什麼是這部分使用if(self)self的?

//And in some viewcontroller contains. 
    self = [super initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]]; 
    if (self) { 
     //Do some stuff 
    } 
    return self; 
+0

@Amar,我問如果(自己)和沒有如果(自己) – iniyaniOS

+0

不做'自我檢查是錯誤的。 IMO沒有解釋。 – Amar

+0

@Amar,self = [super initWithNibName:@「ViewController」bundle:[NSBundle mainBundle]]; 迴歸自我; – iniyaniOS

回答

3

當你在你的方法來訪問實例變量的代碼就相當於通過自指針解決這些問題:

- (void)method { 
    iVar = 1; 
    // actually the following line will be executed: 
    self->iVar = 1; 
} 

因此,如果由於某種原因,自指針是零,您訪問高德在init方法,你的應用程序將會崩潰,因爲您會嘗試刪除空指針。例如下面簡單的例子會崩潰:

@implementation TestObj { 
    int a; 
} 

- (id) init { 
    self = [super init]; 
    self = nil; 

    a = 1; // Crash 
    return self; 
} 
@end 

此外,如果你的[超級的init]方法以任何理由返回nil,這可能是指標出現了錯誤,你不應該用對象的初始化並與所需的其他工作繼續進行它。

+0

+1,用於'自動> iVar'部分。 – Amar

-1

if(self)的檢查,以確保無論'self'它實際上是開始做事之前存在。

自身是一個對象,所以如果它不存在,那麼自我將是未定義的,並且if(self)將評估爲false,跳過代碼塊。

+0

這是不正確的。超級調用將返回對象或零,沒有別的(否則你的應用程序嚴重破壞)。在nil對象上調用消息也是允許的(它們什麼都不做)。看到幾乎所有的答案都正確。 –

+0

「超級初始化」方法可以並且通常會返回一個不同於傳入的_different_對象。您不能對結果做任何假設。 – gnasher729

+0

是的,但它不是「未定義」,因爲celem聲稱。另外,問題是「如果發生什麼」,並且這個答案根本不回答這個問題。它回答了「自我檢查是什麼?」的問題。我低估了答案併爲其添加了解釋,儘管我現在看到我沒有那麼做。 –

2

關於檢查是否存在自我代碼:

if (self) { 
    //Do some stuff 
} 
return self; 

,如果你想設置的初始屬性值唯一必要。這就是爲什麼有評論

// Do some stuff 

如果你不打算任何初始值設定爲變量或屬性,不檢查自我是必要的,它是好的,馬上return self

+1

如果你沒有初始化任何東西,不要重寫'init'。 – jlehr

1

[super initWith...]方法總是有可能失敗,因此返回self即nil,因爲它尚未創建。

在這種情況下,在對其進行操作之前,測試self是否已正確初始化是一種很好的做法。

if (self)實際上是「捷徑」 if (self != nil),因爲任何有效的對象將具有一個非空的存儲器地址,因此,if測試將與任何大於0(零)不同succedd。

2

if (self)正在檢查調用super是否在初始化後實際返回對象。如果出現問題,則繼續進行是沒有意義的,並且還會產生運行時錯誤。

請記住,init方法應該初始化您正在創建類的類型的對象,並返回該對象。你的init方法會覆蓋super方法,這就是爲什麼你調用super的原因,所以Apple的代碼首先運行,然後你在init方法返回的對象上做一些事情,比如UIViewController。

然後,當然,您的init方法也必須返回該對象(self)。

相關問題