2010-10-05 3 views
2

Je le code suivant pour une propriété dont getter/setter-je écrire manuellement à l'aide du mot-clé @dynamic:Devrais-je utiliser @property (retain) pour un setter de propriétés @dynamic en cours de conservation?

@property (nonatomic, retain) NSObject* obj; 

@dynamic obj; 
-(NSObject*) obj 
{ 
    return obj; 
} 
-(void) setObj:(NSObject*)newObj 
{ 
    [obj release]; 
    obj = [newObj retain]; 
} 

Ma question est, si je retire Retain de la déclaration @property, le compilateur se plaint que la le défaut sera assigné et que ce n'est peut-être pas ce que je veux. Si j'ajoute la retenue, je suppose qu'elle va être ignorée, parce que j'ai écrit les getters/setters moi-même?

Juste à la recherche d'une confirmation rapide à ce sujet.

+5

Notez que si vous fournissez l'implémentation dans la même classe que la propriété est déclarée, vous n'avez pas besoin de '@ dynamic'. '@ dynamic' indique au compilateur que le setter et le getter seront fournis au moment de l'exécution, généralement par une autre classe ou une classe de base. –

+0

merci, c'est bon à savoir! – LearnCocos2D

Répondre

3

Vous avez raison, mais votre déclaration de propriété est autant pour la documentation que pour votre implémentation, au moins dans ce cas. À un certain moment, quelqu'un (vous dans six mois?) Regardera votre fichier .h et dira, "Pourquoi cette valeur n'est-elle pas conservée? Comment cela ne se bloque-t-il pas chaque fois qu'il fonctionne ou fuit la mémoire comme un tamis?"

+0

Je fais d'autres choses dans le setter mais j'ai enlevé cela pour plus de clarté. – LearnCocos2D

0

Retain permet à votre objet de rester alloué en mémoire jusqu'à ce que vous appliquer

[obj release]; 

même si vous avez votre propre setter et getter vous devez garder la conserver pour garder votre place dans la mémoire, parce que dans à la fin vous avez seulement un pointeur vers cette position et c'est pourquoi le compilateur vous permet de modifier un autre objet ou quoi que ce soit qui prend la place de votre objet.

Et il est important que vous faites la libération pour libérer la mémoire lorsque vous avez fini de l'utiliser.

+0

Ce n'est pas ce qu'il demandait. Il ne demande pas "Devrais-je retenir dans mon setter personnalisé?" Il demande: «Est-ce que la déclaration de propriété devrait dire« retenir »si j'ai un coutumier qui retient? – Chuck

Questions connexes