2011-04-16 2 views
0

Ceci est ma première utilisation du mot-clé @dynamic. J'essaie d'utiliser des données de base. J'ai une classe faisant référence à un objet de type NSManagedObject. L'objet du type NSManagedObject a été créé automatiquement par XCode à partir d'une entité de données de base existante que j'avais configurée.La référence à l'accesseur @dynamic ne peut pas être compilée

Le code ne sera pas compilé en raison d'une erreur sur la ligne commençant par 'Client.FirstName'. Voir la note dans le commentaire sur cette ligne.

Puisque la référence est à un accesseur dynamique, je suis surpris que le compilateur signale cela comme une mauvaise référence. Cela semble assez simple, mais il me manque évidemment quelque chose. Je ne suis pas sûr de ce qui ne va pas.

Le code est le suivant:

aTestClass.h

#import <Foundation/Foundation.h>  

@interface aTestClass : NSObject { 

} 

- (void) foo; 

@end 

aTestClass.m

#import "aTestClass.h" 
#import "Client.h" 

@implementation aTestClass 

- (void) foo { 
    Client.FirstName = @"CompilerFail"; // Fails here: Property 'FirstName' not found in object of type 'Client' 
} 

@end 

et les codes des clients est ce NSManagedObject, généré automatiquement par XCode 4.

Client.h

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 


@interface Client : NSManagedObject { 
//@private 
} 
@property (nonatomic, retain) NSString * FirstName; 
@property (nonatomic, retain) NSString * LastName; 
@property (nonatomic, retain) NSString * Company; 
@property (nonatomic, retain) NSSet* Jobs; 

@end 

Client.m

#import "Client.h" 

@implementation Client 
@dynamic FirstName; 
@dynamic LastName; 
@dynamic Company; 
@dynamic Jobs; 

- (void)addJobsObject:(NSManagedObject *)value {  
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; 
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 
    [[self primitiveValueForKey:@"Jobs"] addObject:value]; 
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; 
    [changedObjects release]; 
} 

- (void)removeJobsObject:(NSManagedObject *)value { 
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; 
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects]; 
    [[self primitiveValueForKey:@"Jobs"] removeObject:value]; 
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects]; 
    [changedObjects release]; 
} 

- (void)addJobs:(NSSet *)value {  
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; 
    [[self primitiveValueForKey:@"Jobs"] unionSet:value]; 
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value]; 
} 

- (void)removeJobs:(NSSet *)value { 
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; 
    [[self primitiveValueForKey:@"Jobs"] minusSet:value]; 
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value]; 
} 

@end 
+0

Il serait grandement utile si vous suivez les conventions de nommage de la langue; les cours commencent par des majuscules. Les méthodes et les propriétés commencent par des lettres minuscules. – bbum

Répondre

2

Est-ce le code complet?

Client.FirstName = @ "CompilerFail";

Client comme dans "la classe Client"? Ou est Client une instance de la classe Client? C'est pourquoi les variables d'instance ne doivent pas commencer par une lettre majuscule. C'est confu.

Votre code devrait probablement ressembler à ceci.

Client *someClient = ... 
someClient.firstName = @"Foo"; 

Vous pouvez voir exactement ce qu'est une classe et ce qu'est une variable ou une propriété.

+0

Merci, c'était mon problème, essentiellement - en oubliant d'instancier de la classe. Je l'ai redressé maintenant. – Jim

Questions connexes