Сбор мусора основных объектов фундамента
Запуск статического анализатора на этом фрагменте кода:
- (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, чтобы включить его.