Вопрос

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

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

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

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

Это предупреждение, которое я должен исправить чем-то вроде этого:

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

или это просто ложноположительный результат, учитывая, что скопированный объект подключен по бесплатному мосту?

Это было полезно?

Решение

Попробуй это:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top