Сбор мусора основных объектов фундамента


Запуск статического анализатора на этом фрагменте кода:

- (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 4

1 ответ:

Попробуйте вот что:

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

Без CFMakeCollectable, это будет протекать в GC, потому что CFRetain отличается от ObjC -retain. A CFRetain отключает сборку мусора этого объекта и требует CFMakeCollectable, чтобы включить его.