2009-09-03 144 views
4

運行在這段代碼靜態分析:垃圾收集對象

- (id) readForeignPref 
{ 
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); 
return [(id)matchStyle autorelease]; 
} 

產生以下警告:

調用函數「CFPreferencesCopyAppValue」返回一個Core Foundation對象有+1保留計數(擁有參考)。核心基礎對象不會自動收集垃圾。

這是一個警告,我應該事端醜陋這樣的修正:

- (id) readForeignPref 
{ 
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); 
id nsMatchStyle = [(id)matchStyle copy]; 
if (matchStyle) { 
    CFRelease(matchStyle); 
} 
return [nsMatchStyle autorelease]; 
} 

或者這只是一個假陽性,因爲複製的對象是免費電話橋接?

回答

8

試試這個:

- (id) readForeignPref 
{ 
     CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); 
     return [(id)CFMakeCollectable(matchStyle) autorelease]; 
} 

沒有CFMakeCollectable,這將在GC泄漏,因爲CFRetain是不是ObjC -retain不同。 A CFRetain禁用該對象的垃圾回收,並且需要CFMakeCollectable才能啓用它。

+4

而不是鑄造CFMakeCollectable(),使用NSMakeCollectable()。但除此之外,kperryua的答案是正確的。另請參閱:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html – 2009-09-03 14:58:37

+0

CFMakeCollectable只是CFRelease的CF對象。由於該對象是從GC區域分配的,因此收集器將始終使用0保留計數來管理CF對象。 (實現細節,但是......你有它) – bbum 2009-09-03 15:00:59