2011-09-11 69 views
1

我有以下的(改編自蘋果低級別文件管理 - 解決別名)Core Foundation的對象 - 潛在的泄漏

NSString *resolvedPath = nil; 
... 
resolvedPath = (NSString*)CFURLCopyFileSystemPath(resolvedUrl, kCFURLPOSIXPathStyle); 
... 
return resolvedPath; 

構建&分析生成以下警告: -

194:3 Potential leak (when using garbage collection) of an object allocated on line 187 and stored into 'resolvedPath' 

細節狀態: -

187:32 Call to function 'CFURLCopyFileSystemPath' returns a Core Foundation object with a +1 retain count (owning reference). Core Foundation objects are not automatically garbage collected 

194:3 Object returned to caller as an owning reference (single retain count transferred to caller) 

194:3 Object allocated on line 187 and stored into 'resolvedPath' and returned from method 'getTarget:' is potentially leaked when using garbage collection. Callers of this method do not expect a returned object with a +1 retain count since they expect the object to be managed by the garbage collector 

是否有內存泄漏?

如果讓我怎麼解決?

如果不是我應該如何防止警告?

回答

0

我是否有內存泄漏?

你應該認爲它是一個泄漏。在GC中,不保證將cf類型的分配註冊到收集器。 GC僅涵蓋一系列類型(顯式objc對象)。你應該假設你創建或複製CF類型與收集登記。無論你是否從一個cf函數返回了一個cftype,這個函數是或者沒有註冊到收集器中都沒有被公開(這可能是因爲ns類型是一個cf類型)。

如果是這樣,我該如何解決它?

使用CFMakeCollectable或NSMakeCollectable

+0

謝謝,NSMakeCollectable似乎已經做的工作​​。遺憾的是,在文檔中很難找到這些概念,但一旦發現就很明顯。 – Milliways

1

它只是提醒您分配給resolvedPath創建的對象返回一個retain count of 1,因此除非你的方法是先從new alloccontains copy,則caller有沒有辦法知道它在處理一個retained對象,因此它永遠不會得到released

要修復它改變你的方法名從getTargetnewTarget