我在C++數據結構中存儲了一些Obj-C對象。由於我的垃圾收集下運行,我的對象只能通過C++結構可到達,我打電話CFRetain()以root每個對象添加到結構,以確保它們不會過早地收集:無法訪問的對象在無法訪問後無法安全收集?
- (void) doSomethingFancyWithObjects:(NSArray*)array
{
std::list<NSObject*> list;
for (NSObject* obj in array)
{
id copyAddedToList = [obj copy];
list.push_back(copyAddedToList);
CFRetain(copyAddedToList); // otherwise list.back() becomes unreachable...
}
// ... //
BOOST_FOREACH(NSObject* obj, list)
{
CFRelease(obj);
}
}
是否有必要這樣做?實際上GC有可能在它們變得無法訪問的方法中啓動並收集無法訪問的對象? GC是否可以在任何時間收集,或只在特定的時間收集,如運行循環結束?還沒有設法找到這方面的相關文件。
好的地方,沒有注意到你引用的第一段。但是,蘋果仍然使用「事件循環」來引用主線程的運行循環,所以如果這就是他們的意思,我只能在主線程上運行時保證這種保證(不幸的是,我不是。 ..) – 2011-05-02 19:16:32
哦,你的函數在另一個線程中運行?看起來你應該這樣做CFRetain。與所有其他花哨的東西相比,這可能不是什麼大事! – 2011-05-03 01:29:27
垃圾收集器在其自己的線程中運行,只要感覺需要GC就會運行。你不能認爲它沒有在任何一個特定的功能中運行。 – JeremyP 2011-05-09 15:06:31