0

我正在尝试使用 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"];

有没有人有类似的问题?

4

1 回答 1

0

setValueForKey 方法回调到同一个函数,因为它具有相同的名称。

来自 KVC 文档

setValue:forKey 的默认搜索模式:

当为属性调用 setValue:forKey: 的默认实现时,将使用以下搜索模式:

在接收者的类中搜索名称与模式集匹配的访问器方法:。

如果没有找到访问器,并且接收器的类方法 accessInstanceVariablesDirectly 返回 YES,则接收器将按顺序搜索其名称与模式 _、_is、或 is 匹配的实例变量。

如果找到匹配的访问器或实例变量,则使用它来设置值。如有必要,从对象中提取值,如“表示非对象值”中所述。</p>

如果没有找到合适的访问器或实例变量,则为接收者调用 setValue:forUndefinedKey:。

因此,当您setValue:forKey:使用 key调用时city, implementation 调用setCity:和您的 implementation 调用setValue:forKey:,然后一圈又一圈地走。

为什么你甚至这样做而不是直接设置值?

或者更好的是仍然使用属性,您甚至不需要编写 setter 或 getter。

其他两种方法有效,因为键名不同。(他们有下划线)

于 2013-08-27T15:04:26.227 回答