2011-02-23 29 views
3

在CS193p過程中,他們說,在init方法應該有一個if語句來檢查[super init]作品:爲什麼把[super init]放在if語句中,因爲返回是否爲零,我們仍然返回它?

if (self = [super init]) { 
    self.someProperty = parameter;  
} 
return self; 

我不明白爲什麼這樣做,因爲如果[super init]返回nil,無論if語句的結果如何,該方法本身也將返回nil?

編輯:問題是;爲什麼把self = [super init]放在if語句中。 (不是:爲什麼要有self = [super init]

+0

'[[super alloc] init]'沒有意義。您需要'[super init]'。 – 2011-02-23 22:25:07

+0

可能重複的[爲什麼我應該調用self = \ [super init \]](http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init) – 2011-02-23 22:26:41

+0

是的,對不起,我直接將它輸入到stackoverflow。我的問題是爲什麼把它放在一個if語句中,與你連接的問題不同,爲什麼要這麼做,所以請取消你的投票結束。 – 2011-02-23 22:29:33

回答

4

這是有道理的,因爲在某些情況下[超級初始化]可以返回零,在這種情況下,如果你嘗試訪問某些伊娃,你會崩潰。

例子:

-(id) init { 
    self = [super init]; 
    some_ivar = [[NSObject alloc] init]; //compiler treats this as self->some_ivar 
    //if self == nil you'll get EXC_BAD_ACCESS 

    return self; 
} 
0

應該是if(self = [super init]){...init是一個實例方法,因此只能在已經爲alloc'd的對象上調用。

+0

在直接輸入代碼時,代碼中的alloc是一個錯誤,現在我已經修復了它。 – 2011-02-23 22:33:08

0

您需要調用[super init],以便超類可以執行任何需要執行的一次性初始化。 init方法返回一個代表初始化對象的指針。

將[super init]的結果指定回self是標準的Objective-C約定。這是爲了防止超類作爲其初始化工作的一部分返回與最初創建的對象不同的對象。的NSString的,例如,做這個

所以它的自我= [超級初始化]

我從來沒有見過[超級頁頭]初始化],我一直使用[超級初始化],而據我知識,這是公約

+1

原來的會發生什麼? – 2011-02-23 22:28:31

0

它並不一定要在一個if聲明。
可以很好地把它像

self = [super init]; 
if (self) { 
    self.someProperty = parameter;  
} 
return self; 

如果該語句是有檢查self被正確初始化,它是安全的self.someProperty = parameter

+0

當然''self.someProperty = parameter'與'[self setSomeProperty:parameter]'是一樣的,你可以發送消息給nil對象。 – 2011-02-23 22:35:57

+1

並非如此。使用nil對象訪問屬性不會崩潰。和你發送[nil_object someMethod]一樣; – Max 2011-02-23 22:36:20

+0

@Max我從來沒有說過會崩潰。 – filipe 2011-02-23 22:43:03

1

蘋果詳細解釋了這個特殊的概念在裏面Objective-c programming guide。 (向下滾動到部分「處理初始化失敗」)

但蘋果的示例代碼經常保持外的自賦值if語句

self = [super init]; 
if (self) { 
    //init stuff... 
} 
return self; 

如果您使用的是LLVM 2.0編譯器,它會給你一個警告,並告訴你也把你的陳述包含在括號內。像這樣:

if ((self = [super init])) { 
    //init stuff... 
} 
return self; 
-1

self = [[super alloc] init];創建基類 ,並且稍後嘗試僅調用僅子類方法 時,運行時會窒息。

self = [super init];當基類需要初始化變量值或實例化組合成員時,Objective-C 中常見的是,否則它們使用Nil或(0)值創建。

相關問題