2010-08-06 71 views
2

後,我有這段代碼:意外保留計數調用CFMakeCollectable

CFDictionaryRef lDictionary = AACreateDictionaryForFile(path); 
if (lDictionary) { 
     printf("retct before: %ld\n", CFGetRetainCount(lDictionary)); 
     CFMakeCollectable(lDictionary); 
     printf("retct after: %ld\n", CFGetRetainCount(lDictionary)); 
     return TRUE; 
} else { 
     return FALSE; 
} 

出人意料的是,代碼運行控制檯後顯示以下的輸出:

retct前:1
後 retct :2147483647

我本來期望:

retct前:1
後退:0

我做錯了什麼?我有不正確的期望嗎?

+0

從某種意義上說,你做錯了事情,雖然你在做這件事時並不罕見。不要檢查保留計數。對他們沒有期望。永遠不要根據他們做出決定。它們是實現細節,而不是有用的信息。 – walkytalky 2010-08-06 09:03:37

+0

感謝您驗證我(幾乎)知道我在做什麼。我知道保留數並不是很可靠,但我並不十分期待這些結果。無論如何,我只是想確保沒有更明顯的我失蹤的事情。 – Onio 2010-08-06 14:44:16

回答

1

2147483647是(2^31)-1:這是32位有符號整數的最大值。

垃圾回收器當然使用這個值作爲一種標誌。所以不用擔心,你的代碼是可以的。