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, sianObject
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.
Vous devez vous connecter pour publier un commentaire.
La
strong
prend soin de lui-même sur le ivar niveau, de sorte que vous pouvez simplement faireet c'est tout.
Remarque: si vous ne le faites pas sans détection automatique de propriétés, la ivar serait
et puis l'ARC s'occupe de la conserve et restitue pour vous (heureusement).
__strong
est la qualification par défaut.@synthesize
ressemble avec des (deux) de ces options?@synthesize myObject = _myObject
de garder les noms des iVar et des biens différents. Voir ici (stackoverflow.com/questions/822487) pour savoir si c'est une bonne idée.__strong
parce que c'est déduite si on les laisse sortir.MyObject *_myObject;
?myObject
propriété a étécopy
au lieu destrong
? Avez-vous besoin decopy
dans la coutume setter via_myObject = [anObject copy];
avec l'ARC?strong
). Voir ici pour plus de confusion: clang.llvm.org/docs/AutomaticReferenceCounting.html et de la recherche sur "copier implique __une forte appropriation"Juste pour résumer la réponse
.h fichier
.m fichier
_myObject != anObject
, vous pouvez seulement obtenir un peu de baisse de performance. En outre le réglage d'iVar ànil
est inutile, trop. De ne pas obtenir de toute fiabilité avec_myObject = nil;
, trop.