Objective-C Language Quelles sont les propriétés?


Exemple

Voici un exemple de classe qui comporte deux variables d’instance, sans utiliser les propriétés:

@interface TestClass : NSObject {
    NSString *_someString;
    int _someInt;
}

-(NSString *)someString;
-(void)setSomeString:(NSString *)newString;

-(int)someInt;
-(void)setSomeInt:(NSString *)newInt;

@end


@implementation TestClass

-(NSString *)someString {
    return _someString;
}

-(void)setSomeString:(NSString *)newString {
    _someString = newString;
}

-(int)someInt {
    return _someInt;
}

-(void)setSomeInt:(int)newInt {
    _someInt = newInt;
}

@end

C'est un code assez standard pour créer une variable d'instance simple. Vous devez créer la variable d'instance et créer des méthodes d'accès qui ne font rien sauf définir ou renvoyer la variable d'instance. Ainsi, avec Objective-C 2.0, Apple a introduit des propriétés qui génèrent automatiquement tout ou partie du code standard.

Voici la classe ci-dessus réécrite avec les propriétés:

@interface TestClass

@property NSString *someString;
@property int someInt;

@end


@implementation testClass

@end

Une propriété est une variable d'instance associée à des getters et des setters générés automatiquement. Pour une propriété appelée someString , le getter et le setter sont appelés someString et setSomeString: respectivement. Le nom de la variable d'instance est, par défaut, le nom de la propriété préfixée par un trait de soulignement (la variable d'instance pour someString est appelée _someString , mais elle peut être remplacée par une directive @synthesize dans la section @implementation :

@synthesize someString=foo;    //names the instance variable "foo"
@synthesize someString;    //names it "someString"
@synthesize someString=_someString;        //names it "_someString"; the default if 
                                           //there is no @synthesize directive

On peut accéder aux propriétés en appelant les getters et les setters:

[testObject setSomeString:@"Foo"];
NSLog(@"someInt is %d", [testObject someInt]);

On peut également y accéder en utilisant la notation par points:

testObject.someString = @"Foo";
NSLog(@"someInt is %d", testObject.someInt);