0

我將ARC添加到正在處理的應用程序中。不幸的是,它崩潰了。我發現將所有應用程序更新到ARC的自動腳本將__unsafe_unretained限定符給所有ID爲<的protocolName> type。爲什麼代表應該是不安全的並且不弱?

  1. 爲什麼它不是一個弱類型?我已經將應用程序及其所有子項目部署到了​​iOS 5,因此我的確有弱限定符。

  2. 我的主要問題是如果我宣佈這些代表強壯,我會有一個保留週期。如果我不這樣做,下次我打電話給他們時,他們會成爲殭屍。我檢查並在我的應用程序崩潰之前,代表是NSZombie。

這次死機的原因是什麼?它如何防止?

+2

「爲什麼代表應該是不安全的,不會疲軟?」他們不應該。 – newacct

回答

0

花了一些時間,但我解決它:

  1. 我部署的.xcodeproj項目到iOS 5,但各項指標均留在的iOS 4.3的部署。當我修正它(它在每個目標的「構建設置」中) - 我可以將所有'__unsafe_unretained'更改爲'__weak',並將所有'unsafe_unretained'更改爲'weak'。

  2. 爲了避免保留週期,這些代表應該很弱,並且不再是殭屍(因爲它們很弱並且不安全),並且應用程序不會再崩潰。

如果我還是用iOS4.3-,並沒有unsafe_unretained限定符,我應該只分配爲零那些代表後,我不需要他們了。

0

限定符__unsafe_unretained和week有很多共同點。例如,它們都不會增加保留計數。例如,如果一個視圖控制器持有一個__unsafe_unretained IBOutlet到一個UIView中,並且從視圖層次結構中刪除了那個非常UIView,那麼你(假設你沒有在其他任何地方保留這個視圖)將減少保留計數並且最有可能的是釋放UIView 。然而指針仍然指向那個位置,並且留下了懸掛。如果你知道發生了什麼,這不是很好,但也沒有問題。當屬性達到保留計數0時,弱屬性幫助你避免懸掛指針。

現在,如果你的應用程序崩潰或者屬性顯示爲殭屍,那麼它們將被釋放 - 不管哪個類。

一個不完全正確的陳述是,如果您保留屬性,您將創建一個保留週期。雖然有創建保留週期的可能性,但它實際上取決於您的實現,而不僅僅是屬性聲明。當你保留一個對象時,你擁有所有權,直到你完成了這個對象,通過增加它的保留計數來防止它被釋放。如果您的代表在您持有弱指針時已獲得釋放,則不會阻止它被釋放。我假設你在這裏處理模態視圖控制器 - UIPopoverController是精確的(只是一個猜測)。

您應該使用儀器並查看對象的生命週期並查看誰保留/釋放它。知道這可能會有幫助。否則,你可以粘貼一些代碼,也許會有一個很好的人來幫助你找到問題。

歡呼 羅尼

相關問題