2009-04-28 82 views
1

我想知道如果autorelease池擁有對它擁有的對象的強或弱引用。我猜他們很弱。當我將一個對象添加到自動釋放池時,它不會立即釋放,但會在池被耗盡時釋放,對吧?所以引用應該很弱,即當我將一個對象添加到自動釋放池時引用計數(或保留計數)保持不變?如何引用autorelease池中的對象?

回答

1

是的。保持數保持不變,並且可以喲可以檢查,它是這樣:

id obj = [[NSObject alloc]init]; 
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]); 
    [obj autorelease]; 
    NSLog([NSString stringWithFormat: @"%d", [obj retainCount]]); 
2

autorelease池的全部意義在於,它是一個延遲釋放。例如,你可以調用一個本地對象上的autorelease,這個對象將在一個方法中返回,這樣即使在方法返回時你失去了對象的引用,它也會被釋放。

6

強談到與弱引用使得垃圾回收的內存管理環境(其中弱指針被自動釋放,即使引用清零)的背景意義。啓用GC後,所有保留/釋放/自動釋放調用本質上不做任何操作(儘管NSAutoreleasePool -drain方法觸發垃圾回收)。

現在既然你已經標記爲與iPhone相關的這個問題,而且也對iPhone沒有垃圾收集,我假設你指的是經常引用計數,通過強大的你的意思是增加保留引用對象的數量,而弱者則意味着只存儲指針值。

autorelease方法本質上將對象的所有權從調用代碼移動到當前自動釋放池,您可以考慮調用代碼調用釋放和調用保留池。

因此,該引用非常有效,但是您的代碼失去了所有權並釋放了責任。對象release將在autorelease池被釋放/耗盡時被調用。

0

保留計數保持不變,基本上射擊的對象上一個自動釋放消息使開發人員能夠自由從具有所有權和釋放的責任。

這就是自動釋放池的工作原理 - 每次創建自動釋放池的實例時,都會將其添加到堆棧的頂部,因此係統會使用最近的自動釋放池。每當你在autorelease池中添加任何對象時,它都會被添加到堆棧中的頂層autorelease池中。自動釋放池基本上是一個數組,在其上添加自動釋放對象。當釋放(/排空)特定的自動釋放池時,每個添加到自動釋放池中的對象都會被釋放。在系統開始處理任何事件之前,首先創建一個自動釋放池,並且它會一直存在,直到當前事件循環的執行結束。當系統看到當前事件循環已完成時,它將獲得與該事件循環關聯的最高級別自動釋放池並將其釋放。釋放自動釋放池/釋放意味着將每個對象添加到自動釋放池中,並在對象上釋放釋放消息,直到釋放自動釋放池中的所有對象。