I use core data to store some arrays as strings. The strings are prefixed with STRINGFROMARRAY and delimited by &,&.
I thought it would be neat to override the setters and getters so I wouldn't have to provide code to convert them every time I needed access. I have created a managed object subclass called TestEntity with only one attribute, "memberIds" (string). I have verified that my custom setter and getter seem to work fine:
TestEntity.h:
@interface TestEntity (CoreDataGeneratedAccessors)
- (NSArray*)memberIds;
- (void)setMemberIds:(NSArray *)memberIds;
@end
TestEntity.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
I can set an array value and it properly stores as a string. I can also use valueForKey
to log the value after it's set, and it properly prints as an array.
However, when I attempt to log the entire managed object (without valueForKey:), I get a [NSArray length] unrecognized selector error.
Here's the code I'm using to test this:
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);
And here's the output:
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
Why is the length
message getting sent to my array? And how can I prevent this crash? Thanks!