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?

Foi útil?

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
scroll top