引用@dynamic访问器无法编译

问题描述:

这是我第一次使用@dynamic关键字。我正在尝试使用核心数据。我有一个类引用NSManagedObject类型的对象。 NSManagedObject类型的对象是由XCode从我设置的现有核心数据实体自动创建的。引用@dynamic访问器无法编译

由于在'Client.FirstName'行开始的错误,代码将无法编译。请参阅该行注释中的注释。

由于引用是一个动态存取器,所以我很惊讶编译器会将这个标记为不正确的引用。它看起来很简单,但我显然错过了一些东西。我不确定什么是错的。

的代码是这样的:

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 

和客户端的代码是这个NSManagedObject,通过的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

如果您按照语言的命名约定,它会有很大的帮助;课程以大写字母开头。方法和属性以小写字母开头。 – bbum 2011-04-17 05:17:38

这是完整的代码?

Client.FirstName = @“CompilerFail”;

Client在“名为Client的类”中?或者是ClientClient的一个实例?

这就是为什么实例变量不应以大写字母开头的原因。这很混乱。

你的代码可能应该是这样的。

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

你可以看到什么是一个类,什么是一个变量或属性。

+0

谢谢,那是我的问题,基本上 - 忘了从班级实例化。我现在已经理顺了。 – Jim 2011-04-16 22:16:18