unrecognized selector "length" when attempting to log entire managed object with overridden getter/setter

StackOverflow https://stackoverflow.com/questions/18421700

  •  26-06-2022
  •  | 
  •  

Frage

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!

War es hilfreich?

Lösung

I think the problem is that you have overriden memberIds methods.

In your model, memberIds should return a string, and you've overriden it to return an NSArray. So, when your managedobjet is trying to generate its description, it is assuming that memberIds is a string.

I think the best way to do that it to name your custom getter / setter differently than your model attribute.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top