1

我使用核心数据将一些数组存储为字符串。字符串以 STRINGFROMARRAY 为前缀,并以 &,& 分隔。

我认为重写 setter 和 getter 会很好,这样我就不必在每次需要访问时都提供代码来转换它们。我创建了一个名为 TestEntity 的托管对象子类,它只有一个属性“memberIds”(字符串)。我已经验证我的自定义 setter 和 getter 似乎工作正常:

测试实体.h:

@interface TestEntity (CoreDataGeneratedAccessors)

- (NSArray*)memberIds;
- (void)setMemberIds:(NSArray *)memberIds;

@end

测试实体.m:

@implementation TestEntity

@dynamic memberIds;

- (NSArray *)memberIds
{
    [self willAccessValueForKey:@"memberIds"];
    NSArray *memberIdsArray = [NSArray arrayWithArray:[[[self primitiveValueForKey:@"memberIds"] substringFromIndex:15] componentsSeparatedByString:@"&,&"]];
    [self didAccessValueForKey:@"memberIds"];
    return memberIdsArray;
}

- (void)setMemberIds:(NSArray *)memberIds
{
    NSString *stringFromArray = [@"STRINGFROMARRAY" stringByAppendingString:[memberIds componentsJoinedByString:@"&,&"]];
    [self willChangeValueForKey:@"memberIds"];
    [self setPrimitiveValue:stringFromArray forKey:@"memberIds"];
    [self didChangeValueForKey:@"memberIds"];
}

@end

我可以设置一个数组值并将其正确存储为字符串。我还可以valueForKey在设置值后使用它来记录值,并将其正确打印为数组。

但是,当我尝试记录整个托管对象(没有 valueForKey:) 时,我收到 [NSArray length] 无法识别的选择器错误。

这是我用来测试的代码:

NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"TestEntity" inManagedObjectContext:[SyncEngine sharedEngine].managedObjectContext];
[test setValue:[NSArray arrayWithObjects:@"1", @"2", @"3", nil] forKey:@"memberIds"];
NSLog(@"%@", [test valueForKey:@"memberIds"]);
NSLog(@"%@", test);

这是输出:

2013-08-24 13:59:27.820 0.1[1440:19d03] (
    1,
    2,
    3
)
2013-08-24 13:59:27.820 0.1[1440:19d03] -[__NSArrayI length]: unrecognized selector sent to instance 0xa533800

为什么length消息会发送到我的阵列?我怎样才能防止这种崩溃?谢谢!

4

1 回答 1

2

我认为问题在于您已经覆盖了 memberIds 方法。

在您的模型中,memberIds 应该返回一个字符串,并且您已经覆盖它以返回一个 NSArray。因此,当您的 managedobjet 尝试生成其描述时,它假设 memberIds 是一个字符串。

我认为最好的方法是将您的自定义 getter / setter 命名为不同于您的模型属性。

于 2013-08-24T18:37:48.490 回答