Нераспознанный селектор iOS отправлен в экземпляр - добавление NSDictionary в NSMutableArray - PullRequest
3 голосов
/ 22 сентября 2011

Извиняюсь за массы кода, но люди все равно просят о конечном количестве в конце концов.

При попытке добавить NSDictionary к 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'
* 1005 я получаю следующую ошибку* Это код, выдающий ошибку, насколько я могу судить по трассировке стека и использующий разрывы строк:
NSDictionary *dPlateToAdd = [NSDictionary dictionaryWithObjects:objects forKeys:keys];       
[self.aFinals addObject:dPlateToAdd];

self.aFinals обнуляется в интерфейсе, а затем в качестве свойства, затем синтезируетсяи затем инициализируется следующим образом:

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];
    ...
}

Передаваемый aPrevResults был свойством предыдущего объекта поиска, который с тех пор был освобожден, но был скопирован в свойство контроллера представления и отправленвернуться в новый объект поиска, чтобы добавить больше результатов.

Строка, которая выдает ошибку, работает нормально при первом проходе, но вызывает только проблему при втором запуске, когда я повторно использую массив, которыйТеперь aPrevResults.

Что я сделал не так?Имеет ли что-нибудь из этого смысл?

1 Ответ

6 голосов
/ 22 сентября 2011

-copy возвращает неизменный объект, даже если вы вызываете его в изменяемом массиве. Чтобы получить изменяемую копию, вы должны вызвать метод mutableCopy:

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

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

Кроме того, поскольку вы используете свойство сохранения, вам необходимо компенсировать дополнительное приращение, чтобы сохранить счет, происходящий при копировании:

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

Или, возможно, лучшее и самое чистое решение с использованием метода удобного класса:

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