我正在使用Objective-C在iOS上开发应用程序。
我正在尝试使用Core Data,但我遇到了一个非常奇怪的问题。
@interface Food : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * bought;
@property (nonatomic, retain) NSNumber * quantity;
@end
/
- (void)viewDidLoad {
[super viewDidLoad];
Food* newFood = (Food*)[NSEntityDescription entityForName:@"Food"
inManagedObjectContext:self.managedObjectContext];
NSLog(@"%@", newFood.name);
NSLog(@"%d", [newFood.quantity intValue]);
这将打印出名称,但会在数量上给出错误 我尝试了很多不同的东西,我不知道问题是什么 我没有更改数据模型或在字符串和数字之间做任何不同的事情 我甚至在一个新项目和同样的事情中重新制作了一切。
这是错误:
2015-06-22 13:05:22.219 Test[50408:2682580] Food
2015-06-22 13:05:22.219 Test[50408:2682580] -[NSEntityDescription quantity]: unrecognized selector sent to instance 0x7fdb7ae24a60
2015-06-22 13:05:22.221 Test[50408:2682580] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '- [NSEntityDescription quantity]: unrecognized selector sent to instance 0x7fdb7ae24a60'
答案 0 :(得分:1)
您正在创建一个NSEntityDescription实例,它只描述(因此名称)一个实体。但是不是使用它,而是粗暴地将它强制转换为所需的类,但是转换只会告诉编译器关闭,它不会神奇地将某些内容转换为其他内容。
NSEntityDescription碰巧有一个name属性,这就是该行有效的原因。
尝试
Food *newFood = [NSEntityDescription insertNewObjectForEntityForName:@"Food"
inManagedObjectContext:self.managedObjectContext];
实体描述
实体描述指定(除其他外)实体的名称,用于表示实体的类 实体和实体的属性。实体描述是 很重要,因为给定的类可能用于表示多个 entity-默认情况下,所有实体都由NSManagedObject表示。 核心数据使用实体描述来确定属性a 托管对象具有,需要保存或从中检索的内容 持久性存储,以及对属性值的约束。 实体描述是托管对象模型的属性。
创建受管对象
从根本上说,NSManagedObject是一个与任何其他类似的Objective-C类 Objective-C类。像其他各种类一样,NSManagedObject强加 实例创建的一些约束。如前所述,你必须 将新的托管对象实例与实体对象相关联 定义其属性以及托管对象上下文 定义其环境。因此,您无法初始化托管 对象只需发送一条init消息,就必须使用指定的 初始化程序 -
initWithEntity:insertIntoManagedObjectContext:
- 设置 实体和背景:NSManagedObject *newEmployee = [[NSManagedObject alloc] initWithEntity:employeeEntity insertIntoManagedObjectContext:context];
更多观察结果:
现在我希望Objective-C / Cocoa(-touch)代码使用自动引用计数,因为属性的retain
属性应该与strong
交换
对于NSString属性,您几乎肯定需要copy
而不是strong
使用insertNewObject时会自动保存吗?
不,因为这可能会导致商店中没有完全填充的对象,具体取决于您的型号和尺寸。应用逻辑。
还是必须从委托中调用saveContext?
保存的位置和时间取决于您的应用逻辑。
答案 1 :(得分:1)
您没有获得NSManagedObject
子类Food
,而是获得了NSEntityDescription
。
您不希望entityForName:inManagedObjectContext:
想要insertNewObjectForEntityForName:inManagedObjectContext:
。
您的奇怪调试信息的说明:
name
属性的工作原因是因为它是NSEntityDescription
的属性。将您的Food
媒体资源更改为foodName
并观看会发生什么。 name
电话仍然有效。