发送到实例的 iOS 无法识别的选择器 - 将 NSDictionary 添加到 NSMutableArray
Posted
技术标签:
【中文标题】发送到实例的 iOS 无法识别的选择器 - 将 NSDictionary 添加到 NSMutableArray【英文标题】:iOS unrecognized selector sent to instance - adding NSDictionary to NSMutableArray 【发布时间】:2011-09-22 19:35:50 【问题描述】:为大量代码道歉,但人们通常最终还是要求很多。
尝试将 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'
据我从堆栈跟踪和使用换行符可以看出,这是引发错误的代码:
NSDictionary *dPlateToAdd = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
[self.aFinals addObject:dPlateToAdd];
self.aFinals在接口中被decalar,然后作为属性,合成然后初始化如下:
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】:-copy 即使在可变数组上调用它也会返回不可变对象。要获取可变副本,您必须调用 mutableCopy 方法:
-(id)initWithTerm:(NSString *)thisTerm andPrevResults:(NSMutableArray *)aPrevResults
...
self.aFinals = [aPrevResults mutableCopy];
...
此外,由于您使用的是保留属性,因此您需要补偿额外的增量以保留复制时发生的计数:
self.aFinals = [[aPrevResults mutableCopy] autorelease];
或者,使用便捷类方法可能是最好和最干净的解决方案:
self.aFinals = [NSMutableArray arrayWithArray:aPrevResults];
【讨论】:
天才!谢谢,我还不是很擅长这些东西,但是感谢像你这样的人,我能做到!以上是关于发送到实例的 iOS 无法识别的选择器 - 将 NSDictionary 添加到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 名称标签时出现“无法识别的选择器发送到实例”错误
AppDelegate - 发送到实例的无法识别的选择器[关闭]
UIImageView |无法识别的选择器发送到实例 | Xcode 6.4 | iOS 8.4