Сбор мусора основных объектов фундамента
Запуск статического анализатора на этом фрагменте кода:
- (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];
}
Или это просто ложное срабатывание, учитывая, что скопированный объект бесплатен перекинут мост?
1 ответ:
Попробуйте вот что:
- (id) readForeignPref { CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode")); return [(id)CFMakeCollectable(matchStyle) autorelease]; }
Без
CFMakeCollectable
, это будет протекать в GC, потому чтоCFRetain
отличается от ObjC-retain
. ACFRetain
отключает сборку мусора этого объекта и требуетCFMakeCollectable
, чтобы включить его.