ARC interdit les objets Objective-C dans les structures ou les unions malgré le marquage du fichier -fno-objc-arc

85

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.

Zsolt
la source

Réponses:

170

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;
Zeiteisen
la source
4
cela crée également des problèmes lorsque j'alloue la chaîne qu'il affiche, un avertissement attribuant un objet conservé à un objet variable unsafe_unretained sera libéré après l'attribution. Et quand je l'utilise, il plante
Deepak Singh Negi
8
Cela ne résout pas tous les problèmes, l'objet serait normalement immédiatement libéré et donc indisponible.
Diziet
oui - cela ne fonctionne pas réellement ... la solution est de désactiver l'ARC pour un fichier source dérivé que je n'ai pas encore pu comprendre ...
nielsbot
1
Vous faites cela en ajoutant l'indicateur -fno-objc-arc au fichier dans la phase de construction.
Abizern
Que faire si le champ struct n'est qu'une "référence stupide" et que l'objet est en fait conservé (possédé) ailleurs (par exemple, à l'intérieur d'un 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) ...
Nicolas Miari
30

Plutôt que d'utiliser une structure , vous pouvez créer une classe Objective-C pour gérer les données à la place.

János
la source
Comment? où est l'échantillon?
Alors pourquoi ne pas structurer pour les petits cas d'utilisation?
Devanshu Saini
13

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-arcvous 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.

voidStern
la source
Mais alors comment je peux utiliser des fichiers arc et non-arc dans mes projets. Par exemple, j'utilise sharekit comme non-arc et je peux utiliser des instances pour publier. Les fichiers que j'utilise sont des fichiers arc.
Zsolt
Vous pouvez utiliser -fno-objc-arcpour 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.
voidStern
Merci voidStern .. "mais si vous utilisez des structures C simples comme struct ou union n'importe où, vous ne pouvez pas du tout utiliser ARC." - Je ne pense pas que ce soit vrai. J'utilise ARC pour mes propres fichiers. Et non-arc pour les fichiers libharu. La façon dont j'ai contourné mon problème initial était de transmettre les valeurs séparément au fichier C et d'y créer la structure. Je pense que la clé est le saut d'arc en non-arc en arc.
Zsolt
1
Du tout pourrait être un peu exagéré. En substance, vous ne pouvez pas placer de pointeurs vers des objets dans des structures et des unions, ce qui confondrait ARC. L'utilisation d'une bibliothèque C simple avec des structures et / ou des unions devrait (généralement) être possible.
voidStern
6

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)

Hiroshi Ichikawa
la source
2
Quoi de neuf dans LLVM - WWDC 2018
M. Ming