Objectif C - Custom setter avec l'ARC?

Voici comment j'ai utilisé pour écrire une coutume conservé setter avant:

- (void)setMyObject:(MyObject *)anObject
{
   [_myObject release], _myObject =  nil;
   _myObject = [anObject retain];

   //Other stuff
}

Comment puis-je réaliser cela avec l'ARC lorsque la propriété est définie à forte.
Comment puis-je m'assurer que la variable a de fortes pointeur?

  • Est-ce vraiment la façon dont vous avez utilisé pour écrire des setters? Je pense que vous devriez ajouter un if déclaration de vérification, si anObject n'est pas le même que _myObject. Si ils font référence au même objet avec retain count 1, vous libère de l'objet sur la première ligne et le blocage sur la seconde.
  • Désolé au sujet de l'accident, vous êtes de droite, vous êtes détruire elle. Vous êtes presque droit avec cette deuxième partie, mais il existe un cas: le seul endroit où l'objet est référencé est-ce bien lui-même. Très simplifié: self.title = self.title;, mais cela peut se produire dans la situation est plus complexe. Vous ne savez pas où provenance de l'objet, vous pouvez l'affecter à la propriété et la rampe, il est perdu.
  • ... et non seulement il est perdu, mais dans ce cas précis, le code de la panne. À la libération, il peut être libéré, vous annuler ivar, mais alors conserver la désallocation de l'objet de l'accident.
  • Je ne pouvais pas obtenir le blocage de l'utilisation de votre exemple, mais vous avez raison, il peut provoquer un plantage, il est donc préférable de faire de l'égalité de vérifier
  • en fait, vous ne sont pas mauvais. Si le seul endroit où un objet est référencé est une propriété et que vous définissez un autre objet de la propriété premier objet doit être libéré de toute façon. self.title = self.title; ne tombent pas en panne mais pas à cause de l'incubateur, c'est à cause de la lecture. De lecture doit toujours retourner une autoreleased objet d'une lecture ne doit jamais supposer qu'il va avoir un objet plus long que le récepteur a besoin. De retour d'un objet dans un getter sans retenue et autoreleasing c'est encore une erreur. C'est exactement pourquoi le code ci-dessus ne tombent pas en panne.
InformationsquelleAutor aryaxt | 2012-04-06