引用@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
答
这是完整的代码?
Client.FirstName = @“CompilerFail”;
Client
在“名为Client的类”中?或者是Client
类Client
的一个实例?
这就是为什么实例变量不应以大写字母开头的原因。这很混乱。
你的代码可能应该是这样的。
Client *someClient = ...
someClient.firstName = @"Foo";
你可以看到什么是一个类,什么是一个变量或属性。
+0
谢谢,那是我的问题,基本上 - 忘了从班级实例化。我现在已经理顺了。 – Jim 2011-04-16 22:16:18
如果您按照语言的命名约定,它会有很大的帮助;课程以大写字母开头。方法和属性以小写字母开头。 – bbum 2011-04-17 05:17:38