web-dev-qa-db-fra.com

Comment remplacer les références faibles lorsque j'utilise ARC et que je cible iOS 4.0?

J'ai commencé à développer ma première application iOS avec Xcode 4.2, et je visais iOS 5.0 avec un modèle "d'application utilitaire" (celui qui est fourni avec un FlipsideViewController).

J'ai lu qu'ARC étant une fonctionnalité au moment de la compilation, elle devrait également être compatible avec iOS 4, j'ai donc tenté de cibler mon application sur 4.3 et d'essayer de la compiler. Quand je le fais, j'obtiens cette erreur:

FlipsideViewController.m: erreur: problème de comptage automatique des références: la cible de déploiement actuelle ne prend pas en charge les références __weak automatisées

Il fait référence à cette ligne:

@synthesize delegate = _delegate;

Cette variable est déclarée comme:

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

Je comprends que les "références faibles" ne sont pas prises en charge dans iOS 4, mais je ne comprends pas vraiment pourquoi je voudrais utiliser une référence faible pour commencer, je ne peux pas non plus comprendre comment je réécrirais les choses pour éviter de l'utiliser, tout en tirant toujours parti d'ARC (après tout, il est censé fonctionner avec iOS 4 ET 5, n'est-ce pas?)

87
Mason G. Zhwiti

Pour cibler l'ancien système d'exploitation, vous pouvez utiliser unsafe_unretained au lieu de weak dans votre déclaration de propriété, et cela devrait principalement fonctionner de la même manière. weak fait référence à zéro quand leur cible s'éloigne, mais unsafe_unretained laisse ouverte la possibilité que l'objet auquel vous créez un lien se transforme en pointeur pendant lors de sa désallocation. Ce dernier est le même comportement que si vous aviez utilisé assign comme déclaration de propriété dans la gestion manuelle de la mémoire.

Vous faites cela pour éviter de conserver les cycles, que je mentionne dans ma réponse ici . Vous ne voulez pas avoir un pointeur fort vers quelque chose qui pourrait avoir un pointeur fort vers l'objet d'origine. Ensuite, rien ne serait libéré correctement.

149
Brad Larson

Si vous n'utilisez que des références faibles pour plus de sécurité, appelez manuellement les nouvelles fonctions d'exécution si elles sont disponibles et passez à une affectation simple sur __unsafe_unretained variables sinon.

ZWRCompatibility.h simplifiera quelque peu cela.

11
rpetrich

Grâce à la bibliothèque de compatibilité de Mike Ash PLWeakCompatibilty , vous pouvez désormais également utiliser simplement __weak sur iOS 4.x.

Il est incroyablement facile à configurer et ne nécessite aucune considération ou effort supplémentaire par rapport à 5.x.

10
nschum