2010-11-11 1 views
3

Ceci est une question de suivi de: Difference between self.ivar and ivar?:Comment écrire mon propre setter pour un ivar, par exemple: self.ivar = ...?

self.name = @"hello"; 

Je voudrais savoir ce qui se fait dans la méthode setter magique. Donc la question est: quelqu'un pourrait-il s'il vous plaît poster le code source de la méthode setter? ;-) Merci!

+0

Votre titre de la question ne correspond pas à ce qui est expliqué dans le contenu de votre question ... – BoltClock

+1

Voir [ici] (http://stackoverflow.com/questions/588866/objective-c-properties-atomic-vs-nonatomic/589348#589348) pour une autre version. Notez également que peu importe à quoi ressemble l'implémentation réelle, il suffit de savoir quels sont ses effets. –

Répondre

11

Sans une déclaration de propriété (qui est, vous avez déclaré manuellement les méthodes setter et getter), on indiquera les mettre en œuvre comme ceci:

@interface MyClass : NSObject 
{ 
    NSString *name; 
} 
- (NSString *) name; 
- (void) setName:(NSString *) name; 
@end 

@implementation MyClass 

- (void) dealloc 
{ 
    [name release]; 
    [super dealloc]; 
} 

- (NSString *) name 
{ 
    return name; 
} 

- (void) setName:(NSString *) aName 
{ 
    if (aName != name) 
    { 
     [name release]; 
     name = [aName retain]; 
    } 
} 

@end 

setters atomique pourrait ressembler à ceci:

- (void) setName:(NSString *) aName 
{ 
    @synchronized(self) 
    { 
     if (aName != name) 
     { 
      [name release]; 
      name = [aName retain]; 
     } 
    } 
} 
+1

La déclaration peut toujours utiliser la syntaxe @property. – JeremyP

+2

Et votre réponse n'est correcte que pour les propriétés de conservation. – JeremyP

3

La réponse de base est que vous devez définir une méthode appelée "setXXX:" où "XXX" est le nom de votre propriété, en commençant par une lettre majuscule, par exemple Si votre propriété est appelée "nom", alors votre setter doit s'appeler "setName:". Dans cette méthode, vous devez affecter l'argument à votre ivar réel.

Cela dit, dreamlax a raison de dire qu'il y a plus. Lorsque vous déclarez votre propriété, vous définissez un contrat concernant la manière dont l'affectation fonctionnera en ce qui concerne, par exemple, la sécurité des threads et la gestion de la mémoire. Apple a une grande documentation sur ce sujet, et je vous suggère de le vérifier:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17-SW14

+0

+1 pour le lien vers la doc – ohho

Questions connexes