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.

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;

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.


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.


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)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.