2011-03-18 31 views
3

我在讀這 http://lists.apple.com/archives/objc-language/2011/Mar/msg00084.htmlCFRetain C字符串與垃圾收集器啓用

這是一個長期(有趣)線程,我可能已經錯過了點...

這一點吸引了我的眼球

char* path = [string fileSystemRepresentation]; 
    CFRetain (path); 
    int result = open (path, ...); 
    CFRelease (path); 

我知道你不能做垃圾回收(char *不是CFType)。垃圾回收處於啓用狀態時,它會執行任何操作

我的想法是,這是一個錯誤,或者它實際上並沒有被提出作爲一種解決方案,儘管這是我讀的。

回答

1

是的,這是一個錯誤; CFRetain僅適用於CFTypes。即使啓用了GC,C指針/結構也不會被垃圾收集。在非GC中,字符串被放置在自動釋放池中,所以在池被耗盡之前不需要擔心它。如果你確實需要保持字符串,那麼你需要複製它。

您可能會發現interior pointers上的文檔部分有用;你回來的char *本質上是一個內部指針,雖然你不能訪問它的包含對象。

+0

感謝您驗證。我仍然感到驚訝的是,線程中沒有人提到它。 – hooleyhoop 2011-03-18 17:51:23