【问题标题】:Why does the compiler think this variable is undeclared?为什么编译器认为这个变量是未声明的?
【发布时间】:2013-06-16 20:05:36
【问题描述】:
#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 放入有效,但有人可以判断这是否正确或为什么有效?等等。 提前感谢您的帮助。

【问题讨论】:

  • 合成属性的正确方法是:@synthesize pin = _pin;
  • @zambrey 他的超类是NSManagedObject。如果namepin 是在他的Core Data 模型中定义的实体属性,他应该使用@dynamic,而不是@synthesize
  • @robmayoff 感谢您的纠正。不知道那个。

标签: ios objective-c core-data


【解决方案1】:

你在初始化器中写了这个:

name = iname;

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

self.name = iname;

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

[self setName:iname];

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

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

【讨论】:

  • 哦,我明白了。我的印象是综合属性会自动产生变量。一定是在我的书中读错了什么。非常感谢你抢。
  • 你没有合成属性。您正在声明它们是动态的。如果它们是您的核心数据模型中定义的实体属性,则将它们声明为动态是正确的。我假设它们是实体属性,因为您的超类是 NSManagedObject
  • @ByronS:请注意,根据NSManagedObject documentation,托管对象必须使用指定的初始化程序(initWithEntity:insertIntoManagedObjectContext:)进行初始化。
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2011-05-26
  • 2022-12-06
  • 2019-03-09
  • 1970-01-01
  • 2017-09-17
  • 1970-01-01
相关资源
最近更新 更多