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