在我的班級之一,我有一個-(id) init
方法。在這種方法中發生的第一件事是致電[super init]
超級初始化不再起作用
這很好,但我最近將我的代碼導入了新的xcode項目。我得到一個錯誤,在這條線:
錯誤:自動引用計數問題:委託初始化調用的結果,必須立即返回或分配給「自我」
爲什麼發生這個錯誤?是因爲這是在ARC系統下折舊?或者是其他東西?
在我的班級之一,我有一個-(id) init
方法。在這種方法中發生的第一件事是致電[super init]
超級初始化不再起作用
這很好,但我最近將我的代碼導入了新的xcode項目。我得到一個錯誤,在這條線:
錯誤:自動引用計數問題:委託初始化調用的結果,必須立即返回或分配給「自我」
爲什麼發生這個錯誤?是因爲這是在ARC系統下折舊?或者是其他東西?
你是如何與舊系統做呢?你預期(兩個版本)做
self = [super init];
if (self) ...
return self;
舊的方式是你的方式,但沒有'self ='。這一切究竟做了什麼,爲什麼它以前工作? – SirYakalot
'self'是一個指向正在'init'中構造的對象的指針。 '[super init]'調用超類的構造函數,'self = [super init]'指定變量self指向它。如果你只寫'[超級初始化]'沒有指向'self',它可能仍正常工作,因爲某處環比上漲你可能會'自= [超級初始化]'反正...但你不應該承擔這一點。我想他們不贊成ARC的這種行爲。 – vakio
@vakio:「因爲在某個鏈條上你可能會有自己= [super init]」這是錯誤的答案。 'self'是一個局部變量,在另一個方法中賦值給局部變量不起作用。爲什麼'self = [super init];'是必須的全部原因是因爲'init'可能會返回一個不同於它被調用的對象(或'nil')的對象。如果'init'總是返回被調用的對象,那麼只需'[super init];'就足夠了。它仍然有效的原因是因爲99%的init方法只是返回被調用的對象。 – newacct
它的工作之前,你,因爲LLVM是更嚴格的比GCC以前。海灣合作委員會沒有檢測到這個錯誤,正如@vakio在他的評論中指出的那樣,它的工作原因在於鏈中的某個地方,self = [super init]
存在。 LLVM會在編譯期間檢測到此錯誤,並阻止您編譯不正確的代碼。
這對我有效:
需要自己指定一些東西。
-(id) init {
self = [super init];
return self;
}
讀取錯誤消息。它已經非常清楚地告訴你什麼是錯的,以及如何解決它。 – fzwo
@fzwo我的問題也是之前的原因。 – SirYakalot
對不起,你可能會挑剔,但這不是你問的。你問爲什麼現在發生(通過錯誤信息回答)。 (同樣,我對未來遇到像豆櫃檯抱歉,但我認爲這是既重要又禮貌地嘗試和短語的問題儘可能清晰。如果你的問題還寫着「我看到了錯誤,並有我不會評論已經修好了,但我很好奇它爲什麼在以前工作「。) – fzwo