我正在尝试使用CoreData将一些数据保存到数据库中,因此我使用一些属性创建了名为“Client”的实体。其中两个是'city'和'post_code',两者都是String类型。我还创建了扩展NSManagedObjects的Client类,并在那里编写了一些方法。
-(void) setCity: (NSString*) city
{
[self setValue:city forKey:@"city"];
}
-(NSString*) getCity
{
return [self valueForKey:@"city"];
}
-(void) setPostCode: (NSString*) postCode
{
[self setValue:postCode forKey:@"post_code"];
}
-(NSString*) getPostCode
{
return [self valueForKey:@"post_code"];
}
getPostCode和setPostCode按预期工作,但调用setCity或getCity会导致问题。应用程序停止,方法在线程中循环,如屏幕截图所示。
这就是我称之为那些方法的方法
if([databaseResult count] > 0)
c = [databaseResult objectAtIndex:0];
else
c = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:context];
[c setPostCode:[jsonData valueForKey:@"post_code_invoice"]];
[c setClientType:[jsonData valueForKey:@"company_type"]];
[c setCity:[jsonData valueForKey:@"city_invoice"]];
无论我在那里传递什么数据,它总是在setCity上停止,即使该调用不起作用
[c setCity:@"aaa"];
有没有人有类似的问题?
答案 0 :(得分:0)
setValueForKey方法正在回调同一个函数,因为它具有相同的名称。
来自KVC文档
setValue的默认搜索模式:forKey:
当为属性调用setValue:forKey:的默认实现时,使用以下搜索模式:
在接收者的类中搜索名称与模式集匹配的访问者方法:。
如果没有找到访问者,并且接收者的类方法accessInstanceVariablesDirectly返回YES,则在接收者中搜索其名称与模式_,_is,或者按顺序匹配的实例变量。
如果找到匹配的访问者或实例变量,则用于设置值。如有必要,将从对象中提取值,如“表示非对象值”中所述。
如果找不到合适的访问者或实例变量,则为接收者调用setValue:forUndefinedKey:。
因此,当您使用密钥setValue:forKey:
致电city
时,实施方案会调用setCity:
并执行您的实施电话setValue:forKey:
,然后四处转动。
为什么你这样做而不是直接设置值?
或者更好的是仍然使用属性,甚至不需要编写setter或getter。
其他两种方法有效,因为键名不同。 (他们有下划线 )