Question

L'une des choses que j'ai été aux prises avec, tout en brisant 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 que je suis habitué, de sorte que les choses dans les fichiers déclarant en-tête et les fichiers d'implémentation me confonds un peu.

Disons que j'ai une chaîne. Je voudrais ajouter un peu de texte dans cette chaîne. Qu'est-ce que je déclare dans le fichier d'en-tête et que dois-je faire dans le dossier de mise en œuvre pour permettre que cela fonctionne correctement, et quelles sont @property et @synthesize?

Était-ce utile?

La solution

Dans les mauvais jours avant Objective-C 2.0, il était courant d'écrire des accesseurs 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 seul thread. Il y avait encore plus de choses nécessaires pour les applications multithread.

Propriétés offrent un raccourci soignée pour ce qui précède. Le @property remplace à la fois des déclarations dans l'interface ainsi que de donner à l'appelant de meilleurs conseils sur la sémantique du getter et setter. Il vous permet également de @synthesize les accesseurs de sorte que le compilateur va générer le code pour eux automatiquement (vous ne le faites pas Vous pour les @synthesize, vous pouvez fournir vos propres implémentations si vous voulez). 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 le voir sur 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 un autre mécanisme de verrouillage).

Autres conseils

@property - déclare une propriété avec des modificateurs d'accès et de la mémoire. Les propriétés peuvent être en lecture seule ou readwrite, nonatomic ou atomique (fil de sécurité), assignez / conserver / copie gérés. En fait, vous pouvez déclarer getter simple et setter comme nous l'avons fait à l'époque Tiger, mais déclarant un @property vous aidera à identifier tous les aspects de la propriété à tout moment sans vérifier la mise en œuvre.

@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 en fonction de la définition de @property.

Enfin, vos questions sur la chaîne. Propriétés ne sera pas utile 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 ferez quelque chose comme myObj.string = [[myObj string] stringByAppendingString:@"abc"] ou [[myObj string] appendString:@"abc"] selon la nature mutable / immuable de l'objet chaîne.

En bout de ligne, il est tout à fait un grand sujet pour expliquer tout dans un seul poste. Je vous recommande de lire la documentation d'Apple et peut-être acheter un livre sur Objective-C. Aaron Hillegass a écrit un -. Un bon départ pour tout Objective-C et Mac OS X débutant

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top