2010-09-28 23 views
1

L'une des difficultés que j'ai rencontrées en entrant dans la programmation Objective-C est de comprendre comment manipuler les propriétés. Je suis peut-être hors de ma zone de confort en utilisant un langage de codage approprié par opposition aux langages de script auxquels je suis habitué, donc les choses déclarantes dans les fichiers d'en-tête et les fichiers d'implémentation me troublent quelque peu.Définition des propriétés Rundown dans Objective-C

Disons que j'ai une chaîne. Je souhaite ajouter du texte dans cette chaîne. Que dois-je déclarer dans le fichier d'en-tête et que dois-je faire dans le fichier d'implémentation pour que cela fonctionne correctement, et que sont @property et @synthesize?

Répondre

2

Dans le mauvais vieux temps avant Objective-C 2.0, il était courant d'écrire des getters et setters pour vos variables d'instance, par exemple.

@interface Foo : NSObject 
{ 
@private 
    id foo; 
} 
-(void) setFoo: (id) newFoo; 
-(id) foo; 
@end 

@implementation Foo 

// need dealloc to release foo too. 

-(void) setFoo: (id) newFoo 
{ 
    [newFoo retain]; 
    [foo release]; 
    foo = newFoo; 
} 

-(id) foo 
{ 
    return foo; 
} 
@end 

Et c'est juste dans l'environnement à un seul thread. Il y avait encore plus de choses nécessaires pour les applications multithread.

Les propriétés fournissent un raccourci soigné pour ce qui précède. Le @property remplace les deux déclarations dans l'interface et donne à l'appelant de meilleurs indices sur la sémantique du getter et du setter. Il vous permet également de @synthesize les accesseurs de sorte que le compilateur va générer le code pour eux automatiquement (vous n'avez pas avoir pour les @synthesize, vous pouvez fournir vos propres implémentations si vous le souhaitez). Toutes ces peuvent être remplacés par

@interface Foo : NSObject 
{ 
@private 
    id foo; 
} 
@property (nonatomic, retain) id foo; 
@end 

@implementation Foo 

// need dealloc to release foo too. 

@synthesize foo; 
@end 

Cela permet d'économiser beaucoup de taper, mais aussi vous pouvez voir à partir de l'interface qui setFoo: conservera sa nouvelle valeur et que la propriété n'est pas sûr à utiliser (pour définir ou get) dans un environnement multithread (sans autre mécanisme de verrouillage).

1

@property - déclare une propriété avec des modificateurs d'accès et de mémoire. Les propriétés peuvent être readonly ou readwrite, nonatomic ou atomic (thread thread), assigner/conserver/copier géré. En fait, vous pouvez déclarer des méthodes de getter et de setter simples comme nous l'avons fait à l'ère du tigre, mais déclarer un @property vous aidera à identifier tous les aspects de la propriété à tout moment sans vérifier l'implémentation.

@synthesize - simplifie le travail si vous avez besoin d'une propriété simple sans travail complexe dans getter et setter. Il définit une implémentation par défaut selon la définition de @property.

Enfin, vos questions sur la chaîne. Les propriétés n'aideront pas ici si vous cherchez quelque chose de simple, disons myObj.string += "abc". Ce n'est pas le style Objective-C et avec ou sans propriété vous allez faire quelque chose comme myObj.string = [[myObj string] stringByAppendingString:@"abc"] ou [[myObj string] appendString:@"abc"] en fonction de la nature mutable/immuable de l'objet chaîne.

En fin de compte: c'est un sujet assez important pour tout expliquer dans un seul article. Je vous recommande de lire la documentation Apple et peut-être d'acheter un livre sur Objective-C. Aaron Hillegass a écrit un - un bon début pour tout débutant X-Objective-C et Mac   OS  .