开发者

iOS unrecognized selector sent to instance - adding NSDictionary to NSMutableArray

Apologies for the masses of code but people usually ask for lots in the end anyway.

I'm getting the following error when trying to add an NSDictionary to an NSMutableArray

2011-09-22 18:52:54.153 NPT[4788:1603] -[__NSArrayI addObject:]: unrecognized selector sent to instance 0x72f1280
2011-09-22 18:52:54.154 NPT[4788:1603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x72f1280'
Call stack at first throw:
(
0   CoreFoundation               开发者_如何学运维       0x028e5919 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x02a335de objc_exception_throw + 47
2   CoreFoundation                      0x028e742b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
3   CoreFoundation                      0x02857116 ___forwarding___ + 966
4   CoreFoundation                      0x02856cd2 _CF_forwarding_prep_0 + 50
5   NPT                                 0x00007197 -[Search addPlateToFinals:withSubCount:] + 791
6   NPT                                 0x0000626f -[Search makeNumberedPlatesForPass:] + 1132
7   NPT                                 0x0000401f __-[FirstViewController improveSearch]_block_invoke_1 + 173
8   libSystem.B.dylib                   0x96f02a24 _dispatch_call_block_and_release + 16
9   libSystem.B.dylib                   0x96ef4cf2 _dispatch_worker_thread2 + 228
10  libSystem.B.dylib                   0x96ef4781 _pthread_wqthread + 390
11  libSystem.B.dylib                   0x96ef45c6 start_wqthread + 30
)
terminate called after throwing an instance of 'NSException'

This is the code throwing the error, as far as I can tell from the stack trace and using line breaks:

NSDictionary *dPlateToAdd = [NSDictionary dictionaryWithObjects:objects forKeys:keys];       
[self.aFinals addObject:dPlateToAdd];

self.aFinals is decalared in the interface, and then as a property, then synthesized and then initialized as follows:

Search.h

@interface Search : NSObject {
...
NSMutableArray *aFinals;
...

}
...
@property (nonatomic, retain) NSMutableArray *aFinals;
...
@end

Search.m

...
@synthesize aFinals;
...

-(id)initWithTerm:(NSString *)thisTerm andPrevResults:(NSMutableArray *)aPrevResults {

    ...
    self.aFinals = [aPrevResults copy];
    ...
}

The aPrevResults that is passed in, was a property of a previous search object that has since been released, but has been copied to a property of the view controller, and sent back into a new search object, to add more results.

The line that is throwing the error works fine on the first pass, but is only causing a problem on this second run, when I reuse the array that is now aPrevResults.

What have I done wrong? Does any of this make sense as at all?


-copy returns immutable object even if you call it on a mutable array. To get mutable copy you must call mutableCopy method:

-(id)initWithTerm:(NSString *)thisTerm andPrevResults:(NSMutableArray *)aPrevResults {

    ...
    self.aFinals = [aPrevResults mutableCopy];
    ...
}

Also since you're using retaining property you need to compensate extra increment to retain count occurring on copy:

 self.aFinals = [[aPrevResults mutableCopy] autorelease];

Or, probably the best and the cleanest solution using convenience class method:

 self.aFinals = [NSMutableArray arrayWithArray:aPrevResults];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜