web-dev-qa-db-fra.com

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

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 supposé que si vous le marquez -fno-objc-arc, vous n'avez pas cette restriction.

85
Zsolt

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 dit 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;
171
zeiteisen

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

30
János

En effet, arc ne peut pas suivre les objets dans des structures ou des unions (car ils sont alors des pointeurs C simples).

Même si vous avez marqué le fichier/la classe en question avec -fno-objc-arc vous pouvez toujours lui passer un objet contrôlé par arc en tant que paramètre, ce qui entraînerait très probablement une fuite de mémoire.

13
voidStern

On dirait que cela fonctionne maintenant sans erreur, probablement après cette modification .

en d'autres termes, vous pouvez placer des pointeurs normaux (forts) sur 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)

5
Hiroshi Ichikawa