2012-01-29 33 views

回答

4

Transitioning to ARC Release Notes

使用Xcode的指南:編輯>重構>轉換成Objective-C的ARC。首先,它可能會報告各種問題(在預先檢查階段),嘗試修復所有問題,再次嘗試(再次建立和失敗),最後在所有問題都會順利完成時最終順利完成修復,讓您的代碼與ARC。

請注意,預檢規則比平常的構建設置更加困難。

1

簡短回答是肯定的。 strong是相當於retain的ARC,而weak相當於assign,只有它也爲零(如果對象被釋放,則將指針設置爲nil,防止潛在的EXC_BAD_ACCESS崩潰),所以它甚至優於assign。如前所述,如果您有興趣,Transitioning to ARC Release Notes頁面會提供更多詳細信息。

+0

弱並不完全等同於賦值。 unsafe_unretained是等效的。實際上,弱點是需要運行時支持的新功能(iOS5/OSX10.6以上)。 。不同之處在於,當對象消失時weak將自動設置爲零,而assign/unsafe_unretained可以留下懸掛指針。 – 2013-01-27 10:27:15

+0

到底是什麼,我剛剛評論過一個非常古老的問題。我到底怎麼了?我以爲我點擊了未答覆。 。 。當時ARC是新的,毫無疑問你現在知道這一切。 。 。值得一提的是。 – 2013-01-27 10:32:36

2

據我所知,strongretain是同義詞,所以他們做的恰好與相同。
編輯:另外unsafe_unretainedassign的同義詞,因爲 nielsbot 指出。

然後weak幾乎就像assign,但是在它指向的對象被釋放後自動設置爲零。

這意味着,您可以簡單地更換它們。

但是,我遇到了一個特殊情況,我不得不使用assign而不是weak。假設我們有兩個屬性delegateAssigndelegateWeak。在這兩者都存儲我們的代表,這是擁有我們的唯一有力的參考。代表正在釋放,因此我們的-dealloc方法也被調用。

// Our delegate is deallocating and there is no other strong ref. 
- (void)dealloc { 
    [delegateWeak doSomething]; 
    [delegateAssign doSomething]; 
} 

的代表已經在釋放過程中,但還沒有完全釋放。問題是weak對他的引用已經無效!屬性delegateWeak包含零,但delegateAssign包含有效的對象(所有屬性已經釋放並且無效,但仍然有效)。

// Our delegate is deallocating and there is no other strong ref. 
- (void)dealloc { 
    [delegateWeak doSomething]; // Does nothing, already nil. 
    [delegateAssign doSomething]; // Successful call. 
} 

這是很特殊的情況,但它揭示了我們那些weak變量是如何工作的,他們都無效的時候。

+1

我認爲'assign'和'unsafe_unretained'在ARC下是等價的 – nielsbot 2013-01-27 10:45:40

相關問題