web-dev-qa-db-fra.com

Avec le comptage automatique des références, pourquoi la conservation, la libération et la désallocation ne sont-elles pas autorisées?

Lorsque vous essayez d'utiliser -retain, -release, et -dealloc lors de la création de mon application à l'aide du comptage automatique des références dans Xcode 4.2, j'obtiens une erreur comme celle-ci:

Le comptage automatique des références interdit l'envoi explicite de messages de "dealloc"

Pourquoi est-ce que je vois cette erreur? Sont -retain, -release, et -dealloc n'est plus autorisé avec le comptage automatique des références?

39
Jean

Fondamentalement:

Lorsque vous utilisez ARC, c'est tout ou rien. Soit le compilateur gère pour vous toutes les rétentions/versions/deallocs, soit il ne fait rien. Vous ne pouvez pas intercaler vos propres appels, car le compilateur veut tout faire lui-même. Cela peut faire des optimisations absurdes en faisant cela (par exemple, une méthode qui a renvoyé un objet libéré automatiquement sous Gestion de la mémoire manuelle peut maintenant produire un objet qui ne se retrouve jamais dans un pool de libération automatique). Si vous deviez commencer à saupoudrer vos propres appels pour les conserver et les libérer, le compilateur devrait travailler avec ceux-ci et ne serait pas en mesure d'effectuer la plupart des optimisations qu'il souhaite (et que vous devriez souhaiter).

Et en prime, en invoquant -retainCount est maintenant une erreur de compilation! OH HAPPY DAY!

67
Dave DeLong

Sous le comptage automatique des références, la conservation, la libération et la désallocation ne sont pas autorisées.

Si vous avez un code existant, vous pouvez continuer à l'utiliser tel quel avec -fno-objc-arc, vous pouvez désactiver sélectivement ARC sur n'importe quel fichier.

Si vous souhaitez désactiver ARC sur plusieurs fichiers:

Sélectionnez les fichiers souhaités dans Target/Build Phases/Compile Sources dans Xcode PRESS ENTER. (double-cliquez pour sélectionner un seul fichier) Tapez -fno-objc-arc Appuyez sur Entrée ou Terminé

1
Ved Gupta

en réponse à AliSoftware: nous CNA mélange des frameworks ARTC et non-ARC, ainsi que des sources arc et non-ARC.

(Je l'ai fait..)

Les idées de base sont: 1) le compilateur insérera/supprimera des appels comme un très bon programmeur de cacao peut le faire 2) le cacao est un code C DE TOUTE FAÇON, nous avons donc des compilations distinctes, donc l'éditeur de liens PEUT lier les binaires produits par plusieurs sources. Pensez-y car nous pouvons mélanger asm et cacao, ou C et Pascal ...

dans l'opinion principale l'Appleadvantege sur c #/Java est ici: nous sommes toujours permet de mélanger, et, en utilisant une technique COMPILER 8non un runtime ..) nous pouvons accélérer les performances au-delà.

1
ingconti

Comme je l'ai souligné dans mon réponse sur Xcode ARC , vous pouvez compiler spécifique fichiers source non -ARC. Dave DeLong la réponse est un peu décalée. Il n'inclut pas le fait que vous pouvez demander au compilateur de compiler la source en tant que nonARC dans un projet compatible ARC (comme expliqué ici ).

0
Aleksander Azizi