为什么编译器认为这个变量是未声明的?

时间:2013-06-20 05:01:44

标签: ios objective-c core-data

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


@interface Employee : NSManagedObject

@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* pin;

-(id) initWithName:(NSString*)name Pin:(NSNumber*)pin;

@end


@implementation Employee

@dynamic name;
@dynamic pin;

-(id) initWithName:(NSString*)iname Pin:(NSNumber*)ipin{
    self = [super init];
    if(self){
        name = iname;
        pin = ipin; 
    }
    return self;
}
@end

编译器说.m文件中的名称和引脚未声明。我究竟做错了什么? 将self.nameself.pin设置为有效,但有人可以判断这是否正确或者为什么会这样?等等 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您是在初始化程序中写的:

name = iname;

由于您没有名为name的局部变量,编译器会查找名为name的实例变量,或名为name的静态或全局变量。您没有名为name的实例变量,也没有静态或全局变量。您有一个名为name的属性。要设置属性,您需要使用“点表示法”:

self.name = iname;

或者您需要发送setName:消息:

[self setName:iname];

这两个编译完全相同的代码。

请注意,由于您的超类是NSManagedObject,我认为Employee是您的核心数据模型中定义的具有属性namepin的实体。如果是这样,使用@dynamic是正确的。如果这些不是模型中定义的属性,那么您可能应该使用@synthesize(或省略@dynamic@synthesize并让编译器自动合成属性。