87 votes

Comment procéder pour remplacer les références faibles lorsqu’à l’aide de l’ARC et le ciblage des iOS 4.0 ?

J'ai commencé à développer ma première application iOS avec Xcode 4.2, et a été ciblage iOS 5.0 avec une "application utilitaire de modèle" (celui qui vient avec une FlipsideViewController).

J'ai lu que depuis l'ARC est au moment de la compilation, il devrait être compatible avec iOS 4, donc j'ai essayé de cibler mon application à 4.3, et d'essayer de le compiler. Quand je le fais, j'ai cette erreur:

FlipsideViewController.m: erreur: Automatique de Comptage de Référence Question: Le déploiement actuel de la cible ne prend pas en charge automatisée __références faibles

Il fait référence à cette ligne:

@synthesize delegate = _delegate;

Cette variable est déclarée comme suit:

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

Je comprends que "la faiblesse des références" ne sont pas pris en charge dans iOS 4, mais je ne comprends pas vraiment pourquoi je veux utiliser une référence faible pour commencer, je ne peux pas comprendre comment je pourrais réécrire les choses à éviter de l'utiliser, tout en tirant parti de l'ARC (après tout, c'est censé fonctionner avec iOS 4 ET 5 à droite?)

149voto

Brad Larson Points 122629

Pour cibler les anciens OS, vous pouvez utiliser unsafe_unretained au lieu de weak dans votre déclaration de propriété, et il doit surtout travailler de la même façon. weak références nul d'eux-mêmes lorsque leur cible disparaît, mais unsafe_unretained laisse ouverte la possibilité que l'objet que vous créez un lien vers pourrait se transformer en une balançant pointeur lorsqu'il est libéré. Ce dernier est le même comportement que si vous aviez utilisé l' assign comme une déclaration de propriété dans le manuel de gestion de la mémoire.

Vous faire pour éviter de conserver des cycles, qui, je le mentionne dans ma réponse ici. Vous ne voulez pas avoir une forte pointeur vers quelque chose qui pourrait avoir un fort pointeur de retour à l'objet d'origine. Puis rien ne se libère correctement.

11voto

rpetrich Points 25769

Si seulement l’utilisation de références faibles pour plus de sécurité, appelez manuellement les nouvelles fonctions de runtime si elles sont disponibles et secours à une assignation simple sur `` variables sinon.

ZWRCompatibility.h Cela simplifiera quelque peu.

10voto

nschum Points 3621

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

Il est incroyablement facile à configurer et ne nécessite aucune contrepartie additionnelle ou effort sur 5.x.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X