84 votes

Y a-t-il une différence entre une "variable d'instance" et une "propriété" en Objective-c ?

Y a-t-il une différence entre une "variable d'instance" et une "propriété" en Objective-c ?

Je ne suis pas très sûr de ça. Je pense qu'une "propriété" est une variable d'instance qui possède des méthodes d'accès, mais je peux me tromper.

1voto

yoAlex5 Points 2350

Objective-C : propriété et variable d'instance (iVar)

[variable Swift, propriété...]

Variable d'instance

@interface SomeClass: NSObject
NSString *someVariable;
@end

Propriété

@interface SomeClass: NSObject
@property (nonatomic, strong) NSString *someVariable;
@end

Property utilise Instance variable à l'intérieur. property = variable + bounded getter/setter . Il s'agit d'un appel de méthode avec une syntaxe et un accès variables.

  • @property génère getter y setter méthodes (méthodes d'accès) qui utilise backing ivar (alias backing field) que vous pouvez utiliser via l'underscore _<var_name> ( _someVariable ).

  • Puisqu'il appelle une méthode - method dispatch est utilisé, c'est pourquoi KVO [À propos] peut être appliqué

  • Lorsque vous surchargez les méthodes d'accès, l'iVar de retour n'est pas générée. C'est pourquoi vous pouvez déclarer une nouvelle propriété de manière explicite ou utiliser l'option @synthesize [À propos] pour en créer un nouveau ou le lier à un existant

    import "SomeClass.h"

    @interface SomeClass() @property (nonatomic, strong) NSString *someVariable; @end

    @implementation SomeClass

    • (void) foo {

      //property getter method NSString a1 = self.someVariable; //NSString a1 = [self someVariable];

      //property setter method self.someVariable = @"set someVariable"; //[self setSomeVariable:@"set someVariable"];

      //iVar read NSString *a2 = _someVariable; //iVar write _someVariable = @"set iVar";

    }

    //if you overriding someVariable getter and setter the iVar(_someVariable) is not generated, that is why you can:

    //1. create some variable explicitly NSString *_someVariable;

    //or

    //2. use @synthesize @synthesize someVariable = _someVariable;

    //overriding

    • (NSString*) someVariable { return _someVariable; }

    • (void)setSomeVariable: (NSString*) updatedSomeVariable { _someVariable = updatedSomeVariable; }

    @end

[attributs de propriété]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X