2012-06-20 82 views
1

〜在刪除最後一個強指針後,ARC是否總是釋放一個對象?或者是未確定的,並且在未來某個未指定的時間點將會被釋放?同樣,假設你沒有改變你的程序,每次你運行和編譯你的程序時,ARC總會是一樣的嗎?iOS中的ARC問題

〜你如何處理一個對象到其他類?例如,假設我們在Bakery類中創建Cake對象。這個過程可能需要很長時間並涉及許多不同的方法,所以我們可以將蛋糕放在strong property中。現在假設我們想把這個蛋糕物品交給顧客。客戶也可能希望有一個強大的指針。這個可以嗎?有兩個強類指向同一個對象的類?或者我們應該儘快將Bakery's指針清零?

+0

這應該是兩個獨立的帖子。這兩個要點並沒有很密切的關係。 –

回答

3
  1. 你的代碼的結構應這個問題的答案並不重要 - 如果你想使用一個對象,保持它的指針,不依賴於ARC副作用,以保持它圍繞:)這些副作用可能會因不同的編譯器而改變。

  2. 兩個強大的指針是絕對好的。當兩個指針都指向別的東西時(或者什麼都沒有!),ARC將只釋放對象

0

好吧,首先這個答案可能helpt你也一點點:ARC equivalent of autorelease?

一般最後強變量nilled後,該對象被立即釋放。如果將它存儲在屬性中,則可以將該屬性的值設爲零,將其分配給__strong Foo * temp = self.bar;之前你無,並返回本地__strong變量(雖然弧通常檢測到返回,並自己_strong感染)。

上更多的細節:Handling Pointer-to-Pointer Ownership Issues in ARC

0
  1. ARC將實行適當的保留,並在編譯時的版本。它不會有任何不同,如果你自己把它們放在那裏,所以它總是會做同樣的編譯,並且回答你的問題應該始終表現相同。但是,這並不意味着你的對象會在指針被移除後立即被釋放。因爲你從不以任何形式的目標C直接調用dealloc,所以你只能告訴它沒有引用計數並且它可以安全地釋放。這通常意味着它將立即發佈。

  2. 如果您將一個對象從一個類傳遞到另一個類,並且接收類有一個強關聯的屬性,並且傳遞它的類最終會刪除它的指針,它仍然具有至少爲1的引用計數,並且會沒事的。

0

DeanWombourne的回答是正確的;但要添加到(1)。

特別是,編譯器可能會顯着重新排列語句作爲優化的一部分。儘管方法調用總是以代碼編寫的順序發生(因爲任何方法調用都可能有副作用),但只要重新排序不影響行爲,任何原子表達式都可以由編譯器重新排序。同樣的事情,局部變量重用等...

因此,ARC編譯器將保證只要需要,指針是有效的,沒有更多。但是,當指向對象可能被釋放時,並不能保證它不會超出聲明的範圍。也不能保證對象A是在B之前發佈的,因爲A是在B之前聲明和最後一次使用的。

換句話說,只要你不依賴副作用和競爭條件編寫代碼,它應該全部只是工作。

-1

請保持您的代碼正確,因爲它在不同的編譯器上有不同的行爲。

enter image description here