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