ARC vieta gli oggetti Objective-C nelle strutture o nelle unioni nonostante contrassegni il file -fno-objc-arc? Perché è così?
Ho pensato che se lo contrassegni -fno-objc-arc non hai questa restrizione.
Risposte:
Se hai ricevuto questo messaggio prova __unsafe_unretained. È sicuro solo se gli oggetti nella struttura non vengono conservati. Esempio: se usi OpenFeint con ARC, la classe OFBragDelegateStrings dice questo errore in una struttura.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
per
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
)? In tal caso, non sarà immediatamente deallocato, ma mi chiedo cosa dirà il compilatore (non posso provarlo adesso) ...
Invece di usare una struttura , puoi creare una classe Objective-C per gestire i dati.
Questo perché arc non può tracciare oggetti in strutture o unioni (poiché a quel punto sono semplici puntatori C).
Anche se hai contrassegnato il file / classe in questione con -fno-objc-arc
potresti comunque passare un oggetto controllato da arco ad esso come parametro, il che molto probabilmente provocherebbe una perdita di memoria.
-fno-objc-arc
per mescolare file ARC e non ARC all'interno di un progetto, ma se stai usando strutture C semplici come struct o union ovunque non puoi usare ARC affatto.
Sembra che ora funzioni senza errori, probabilmente dopo questa modifica .
cioè, puoi mettere normali (forti) puntatori a oggetti Objective-C in una struttura C. È gestito da ARC, ad esempio non viene mantenuto quando la struttura viene distrutta. Verificato con:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)