Désactiver le comptage automatique des références pour certains fichiers

183

J'ai téléchargé le SDK iOS 5 et j'ai découvert que l'ARC est une excellente fonctionnalité du nouveau compilateur Apple. Pour le moment, de nombreux frameworks tiers ne prennent pas en charge ARC. Puis-je utiliser ARC pour mon nouveau code et conserver le code de conservation / libération actuel inchangé? Le convertisseur ARC ne fonctionne pas ici, car certains frameworks, tels que JSONKit, ne peuvent pas être convertis en ARC à l'aide du convertisseur.

Éditer:

La réponse est d'ajouter -fno-objc-arcaux indicateurs du compilateur pour les fichiers dont vous ne voulez pas ARC. Dans Xcode 4, vous pouvez le faire sous votre cible -> Phases de construction -> Sources de compilation.

non amélif
la source
2
Pour clarifier, il vous suffit de l'ajouter au .mfichier. Pas le .hfichier.
ma11hew28
J'ai trouvé cette conversation: github.com/gowalla/AFNetworking/issues/36 Peut-être que cela aide quelqu'un à intégrer JSONKit dans un projet pris en charge par iOS5 ARC ;-) Mais je ne l'ai pas essayé pour le moment ...
Cette méthode a fonctionné pour moi. J'ajoutais le AsyncUdpSocket pour UDP Multicast à mon projet et ces fichiers [au moins la version actuelle] ne prennent PAS en charge ARC. J'ai donc utilisé la méthode ci-dessus pour ajouter l'indicateur du compilateur au fichier AsyncUdpSocket.m et je peux faire en sorte que le code fonctionne correctement avec mon application.
Ashu Joshi
2
Cela fonctionne parfaitement! Particularités: accédez à votre cible et choisissez Build Phases, puis Compile Sources. Si vous double-cliquez sur le fichier .m en question, une boîte de dialogue apparaîtra dans laquelle vous pourrez taper / coller: "-fno-objc-arc"
mpemburn

Réponses:

73

La documentation ARC publique , bien qu'elle ne soit pas directement claire sur ce point, semble suggérer que tant que chaque classe est soit entièrement ARC soit gérée manuellement, les classes peuvent être intégrées dans un seul programme.

Vous ne pouvez pas mélanger ARC et non-ARC dans une seule classe; le document dit que l' envoi retain, release, autoreleaseou retainCountmessages par tout moyen (y compris les minuteries et exécute retardées, ce qui l' utilisation @selector) est interdite dans le code ARC. Vous ne pouvez donc pas faire de non-ARC dans une classe ARC (car les messages nécessaires sont interdits) et vous ne pouvez pas faire d'ARC dans une classe non-ARC (car ARC ajoute des éléments de syntaxe qui ne sont pas valides sans ARC).

Le même document est un peu plus clair sur la possibilité d'intégrer des bibliothèques / frameworks non-ARC dans un programme ARC: Oui. Il ne mentionne pas si vous pouvez utiliser des bibliothèques / frameworks ARC dans un programme où tout votre code n'est pas ARC, mais étant donné tout ce qui précède, l'implication semble être oui.

Peter Hosey
la source
Je vous remercie! J'ai compris comment désactiver ARC pour les classes non-ARC existantes.
nonamelive
Pouvez-vous partager avec nous ce que vous faites?
David H
1
@David H: Si vous vouliez adresser cela au questionneur, vous devriez noter que le questionneur a modifié sa solution dans la question.
Peter Hosey
La compilation ARC ne peut pas être désactivée dans les fichiers HEADER. Clang ne compilera PAS l'interface / l'en-tête en fonction de la compilation de son fichier d'implémentation / méthode. Par conséquent, les fichiers d'en-tête doivent être compatibles avec ARC et non-ARC dans une compilation mixte. Je considère cela comme un bogue dans le compilateur.
carmin
1
@carmin: Ce n'est pas le cas. Le compilateur ne regarde pas les fichiers d'en-tête sauf lorsque vous le lui dites, ce que vous ne faites normalement qu'en les #importinsérant à partir de fichiers de module. Le réglage des indicateurs du compilateur est pour chaque fichier de module (plus précisément, chaque fichier dans la phase de construction «Compiler les sources»). Le compilateur n'a aucun moyen de savoir s'il doit utiliser ARC ou non pour un autre fichier, sauf en héritant du choix qui lui a été donné pour le fichier de module avec lequel il a commencé.
Peter Hosey
78

Il n'est pas très intuitif de désactiver ARC sur MULTIPLES fichiers, pendant un certain temps , j'étais le faire un par un jusqu'à ce compris comment faire.

  1. Sélectionnez les fichiers souhaités dans Target / Build Phases / Compile Sources in Xcode (CMD + clic ou Shift + click)
  2. APPUYER SUR ENTREE (un double clic réinitialisera la sélection, donc cela ne fonctionnera pas)
  3. Tapez -fno-objc-arc
  4. Appuyez sur Entrée ou Terminé
Tibidabo
la source
1
Ce n'est pas vraiment une réponse à la question posée ici, mais un bon conseil quand même! A voté +1
Kristof Van Landschoot
Vous avez raison, ce n'est pas le cas, mais j'ai toujours recherché l'interrupteur sur Google et cette réponse est l'un des meilleurs succès. Je pensais que ces jours-ci, la plupart des gens connaissaient déjà la réponse mais pas cette "astuce"
Tibidabo
35

Si vous souhaitez désactiver le comptage automatique des références pour certains fichiers, il est très simple de suivre les étapes suivantes. Vous ajoutez des indicateurs de compilateur dans Targets -> Build Phases -> Compile Sources.

xcode

Le drapeau utilisé est -fno-objc-arc appuyez sur Entrée après l'avoir écrit.! Vous devez double-cliquer sur la colonne de droite de la ligne sous Drapeaux du compilateur. J'espère que cela aide Merci :)

Nikhil Bansal
la source
14
Vous pouvez utiliser la même méthode pour activer ARC sur un fichier spécifique dans un projet non ARC à l'aide de l'indicateur -fobjc-arc.
lnafziger
La compilation ARC ne peut pas être désactivée dans les fichiers HEADER. Clang ne compilera PAS l'interface / l'en-tête en fonction de la compilation de son fichier d'implémentation / méthode. Par conséquent, les fichiers d'en-tête doivent être compatibles avec ARC et non-ARC dans une compilation mixte. Je considère cela comme un bogue dans le compilateur.
carmin