29 votes

Synthèse d'une propriété sans variables d'instance

J'ai cru comprendre @bien et @synthétiser, mais j'ai fait quelques tests et je n'arrive pas à comprendre pourquoi la ci-dessous (ce que je pensais était cassé) code fonctionne.

Comme vous pouvez le voir, il n'y a pas de variable d'instance qui correspond au nom de la propriété. N'Objective-C en quelque sorte de créer une variable d'instance, s'il ne trouve pas une variable d'instance avec le même nom et de même type?

En-tête:

#import <Foundation/Foundation.h>

@interface AddressCard : NSObject {

}

@property (copy, nonatomic) NSString *name;
-(void) print;

@end

Mise en œuvre:

#import "AddressCard.h"

@implementation AddressCard

@synthesize name;

-(void) print {
    NSLog(@"Name=%@", self.name);
}

-(void) dealloc {
    [name release];
    [super dealloc];
}

@end

Test:

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    AddressCard *ac = [[AddressCard alloc] init];
    ac.name = @"Brandon";
    [ac print];

    [ac release];

    [pool drain];
    return 0;
}

25voto

e.James Points 51680

La réponse rapide est: "oui". En Objective-C 2.0, synthétisé les propriétés de créer automatiquement le correspondant ivars que nécessaire.

La documentation d'Apple a un peu plus de détails.

Important: Comme l'a souligné Tommy (note: c'est à partir de l'héritage docs - s'il vous plaît voir les informations les plus récentes):

En Objective-C 2.0 sur le moderne, les durées de fonctionnement (c'est à dire, Intel 64 bits et BRAS), les propriétés peuvent être ajoutés à des classes dynamiquement (c'est, au moment de l'exécution, mais seulement avant la création de toutes les instances - pas particulièrement dynamique par rapport au reste de l'exécution). Cependant, cela ne peut être fait sur l'un des deux plus anciens temps de fonctionnement (c'est à dire, Intel et PowerPC 32 bits). C'est donc pas vraiment quelque chose que vous souhaitez utiliser pour l'envoi de logiciels pour le Mac ou en cours de développement pour iOS (depuis le simulateur est un 32 bits Intel application et ne peut pas créer les variables d'instance au moment de l'exécution)

2voto

z3ple Points 140

Vous pouvez omettre la déclaration de variable d'instance uniquement pour une architecture 64 bits

0voto

Jack Points 816

Je veux ajouter que, bien que la variable d'instance soit créée automatiquement, elle porte le même nom que la propriété. En faisant cela, vous pouvez obtenir des bogues dans votre code plus tard. Ainsi, en plus d'empêcher le cas de ne pas générer automatiquement sur certaines architectures, vous devez toujours créer la variable d'instance afin de ne rien obtenir d'inattendu par la suite.

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