Domanda

L'esecuzione del analizzatore statico su questo pezzo di codice:

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

produce il seguente avviso:

  

Call to funzione 'CFPreferencesCopyAppValue' restituisce un oggetto Nucleo Fondazione con una (di riferimento possedere) +1 trattenere conteggio. oggetti principali della Fondazione non sono automaticamente garbage collection.

Si tratta di un avvertimento dovrei fissare con qualcosa brutto come che:

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

o è solo un falso positivo, dato che l'oggetto copiato è verde ponte?

È stato utile?

Soluzione

Prova questo:

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

Senza la CFMakeCollectable, questo perderà in GC, perché un CFRetain è diverso da un -retain objC. Una CFRetain disabilita garbage collection di tale oggetto, e ha bisogno CFMakeCollectable per abilitarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top