2012-01-20 93 views
0

在我的班級之一,我有一個-(id) init方法。在這種方法中發生的第一件事是致電[super init]超級初始化不再起作用

這很好,但我最近將我的代碼導入了新的xcode項目。我得到一個錯誤,在這條線:

錯誤:自動引用計數問題:委託初始化調用的結果,必須立即返回或分配給「自我」

爲什麼發生這個錯誤?是因爲這是在ARC系統下折舊?或者是其他東西?

+2

讀取錯誤消息。它已經非常清楚地告訴你什麼是錯的,以及如何解決它。 – fzwo

+0

@fzwo我的問題也是之前的原因。 – SirYakalot

+0

對不起,你可能會挑剔,但這不是你問的。你問爲什麼現在發生(通過錯誤信息回答)。 (同樣,我對未來遇到像豆櫃檯抱歉,但我認爲這是既重要又禮貌地嘗試和短語的問題儘可能清晰。如果你的問題還寫着「我看到了錯誤,並有我不會評論已經修好了,但我很好奇它爲什麼在以前工作「。) – fzwo

回答

3

你是如何與舊系統做呢?你預期(兩個版本)做

self = [super init]; 

if (self) ... 

return self; 
+0

舊的方式是你的方式,但沒有'self ='。這一切究竟做了什麼,爲什麼它以前工作? – SirYakalot

+0

'self'是一個指向正在'init'中構造的對象的指針。 '[super init]'調用超類的構造函數,'self = [super init]'指定變量self指向它。如果你只寫'[超級初始化]'沒有指向'self',它可能仍正常工作,因爲某處環比上漲你可能會'自= [超級初始化]'反正...但你不應該承擔這一點。我想他們不贊成ARC的這種行爲。 – vakio

+0

@vakio:「因爲在某個鏈條上你可能會有自己= [super init]」這是錯誤的答案。 'self'是一個局部變量,在另一個方法中賦值給局部變量不起作用。爲什麼'self = [super init];'是必須的全部原因是因爲'init'可能會返回一個不同於它被調用的對象(或'nil')的對象。如果'init'總是返回被調用的對象,那麼只需'[super init];'就足夠了。它仍然有效的原因是因爲99%的init方法只是返回被調用的對象。 – newacct

1

它的工作之前,你,因爲LLVM是更嚴格的比GCC以前。海灣合作委員會沒有檢測到這個錯誤,正如@vakio在他的評論中指出的那樣,它的工作原因在於鏈中的某個地方,self = [super init]存在。 LLVM會在編譯期間檢測到此錯誤,並阻止您編譯不正確的代碼。

0

這對我有效:

需要自己指定一些東西。

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