2009-09-03 3 views
4

Запуск статический анализатор на этот кусок кода:мусора из ядра фонда объектов

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

дает следующее предупреждение:

вызов функции «CFPreferencesCopyAppValue» возвращает объект ядра Foundation с +1 сохранить счет (владеющий ссылкой). Объекты Core Foundation автоматически не собираются с мусором.

Это предупреждение, которое я должен исправить с Somethin уродливой так:

- (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(). Но кроме того, ответ Керрюа верен. См. Также: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html –

+0

CFMakeCollectable просто CFRelease - это объект CF. Поскольку объект был выделен из зоны GC, сборщик всегда будет управлять объектами CF с 0-удержанием. (Детали выполнения, но ... там у вас есть) – bbum

Смежные вопросы