Coleta de lixo de objetos fundamentais principais
-
21-09-2019 - |
Pergunta
Executando o analisador estático neste pedaço de código:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)matchStyle autorelease];
}
produz o seguinte aviso:
Chamado para funcionar 'CFPreferencescopyAppValue' retorna um objeto fundamental principal com uma contagem de retenção A +1 (possuindo referência). Os objetos principais da fundação não são automaticamente coletados de lixo.
Isso é um aviso que devo consertar com algo feio assim:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
id nsMatchStyle = [(id)matchStyle copy];
if (matchStyle) {
CFRelease(matchStyle);
}
return [nsMatchStyle autorelease];
}
Ou isso é apenas um falso positivo, dado que o objeto copiado é uma ponte gratuita?
Solução
Experimente isso:
- (id) readForeignPref
{
CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
return [(id)CFMakeCollectable(matchStyle) autorelease];
}
Sem o CFMakeCollectable
, isso vazará no GC, porque um CFRetain
é diferente de um objc -retain
. UMA CFRetain
desativa a coleta de lixo desse objeto e precisa CFMakeCollectable
para ativá -lo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow