ARC interdit les objets Objective-C dans les structures ou les unions malgré le marquage du fichier -fno-objc-arc? Pourquoi cela est-il ainsi?
J'avais l'hypothèse que si vous le marquez -fno-objc-arc, vous n'avez pas cette restriction.
Réponses:
Si vous recevez ce message, essayez __unsafe_unretained. Ce n'est sûr que si les objets de la structure ne sont pas conservés. Exemple: si vous utilisez OpenFeint avec ARC, la classe OFBragDelegateStrings indique cette erreur dans une structure.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
à
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
)? Dans ce cas, il ne sera pas immédiatement désalloué, mais je me demande ce que le compilateur va dire (impossible de le tester pour le moment) ...
Plutôt que d'utiliser une structure , vous pouvez créer une classe Objective-C pour gérer les données à la place.
En effet, arc ne peut pas suivre les objets dans des structures ou des unions (car ils sont à ce stade des pointeurs C simples).
Même si vous avez marqué le fichier / la classe en question, -fno-objc-arc
vous pouvez toujours lui transmettre un objet contrôlé par arc en tant que paramètre, ce qui entraînerait très probablement une fuite de mémoire.
-fno-objc-arc
pour mélanger des fichiers ARC et non ARC dans un projet, mais si vous utilisez des structures C simples comme struct ou union n'importe où, vous ne pouvez pas du tout utiliser ARC.
On dirait que cela fonctionne maintenant sans erreurs, probablement après ce changement .
c'est-à-dire que vous pouvez placer des pointeurs normaux (forts) vers des objets Objective-C dans une structure C. Il est géré par ARC, par exemple, il n'est pas conservé lorsque la structure est détruite. Vérifié avec:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)