ARC proibisce gli oggetti Objective-C in struct o unioni nonostante contrassegni il file -fno-objc-arc


85

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:


170

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;

4
crea anche problemi quando assegno la stringa mostra l'avviso che l'assegnazione di un oggetto trattenuto all'oggetto variabile unsafe_unretained verrà rilasciato dopo l'assegnazione. E quando lo uso si blocca
Deepak Singh Negi

8
Questo non risolve tutti i problemi, normalmente l'oggetto verrebbe rilasciato immediatamente e quindi non disponibile.
Diziet

sì, in realtà non funziona ... la soluzione è disattivare in qualche modo ARC per un file sorgente derivato che non sono ancora stato in grado di capire ...
nielsbot

1
Puoi farlo aggiungendo il flag -fno-objc-arc al file nella fase di compilazione.
Abizern

Cosa succede se il campo struct è solo un "riferimento stupido" e l'oggetto viene effettivamente mantenuto (posseduto) da qualche altra parte (ad esempio, all'interno di un NSArray)? In tal caso, non sarà immediatamente deallocato, ma mi chiedo cosa dirà il compilatore (non posso provarlo adesso) ...
Nicolas Miari

30

Invece di usare una struttura , puoi creare una classe Objective-C per gestire i dati.


Come? dov'è il campione?

Allora perché non è possibile strutturare per piccoli casi d'uso?
Devanshu Saini

13

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-arcpotresti comunque passare un oggetto controllato da arco ad esso come parametro, il che molto probabilmente provocherebbe una perdita di memoria.


Ma poi come posso usare i file arc e non arc nei miei progetti. Ad esempio, utilizzo sharekit come non-arc e sono in grado di utilizzare istanze per pubblicare. I file che sto usando sono file arc.
Zsolt

Puoi usare -fno-objc-arcper 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.
voidStern

Grazie voidStern .. "ma se stai usando semplici strutture C come struct o union ovunque non puoi usare ARC affatto." - Non credo sia vero. Sto usando ARC per i miei file. E non arco per i file libharu. Il modo in cui ho aggirato il mio problema originale era passare i valori separatamente al file C e creare lì la struttura. Penso che la chiave sia il salto da arco a non arco ad arco.
Zsolt

1
Potrebbe essere un po 'esagerato. In sostanza non puoi inserire puntatori a oggetti in strutture e unioni, il che confonderebbe ARC. L'uso di una semplice libreria C con strutture e / o unioni dovrebbe (di solito) essere possibile.
voidStern

6

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)


2
Novità di LLVM - WWDC 2018
Mr Ming
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.