【发布时间】:2013-02-27 16:38:13
【问题描述】:
我有一个 iVar NSMutableArray* _syncModels,在我的类的 init 方法中我将它初始化为 _syncModels = [[NSMutableArray alloc] initWithCapacity:10];
在整个课程中,我在数组中添加和删除对象,但我从未重新初始化 _syncModels。
所以我收到了这个崩溃报告,上面写着-[NSConcreteData filterUsingPredicate:]: unrecognized selector sent to instance 0x23c740c0。
符号化后,导致此崩溃的行是[_syncModels filterUsingPredicate:[NSPredicate predicateWithFormat:@"NOT (dataManagerFieldRecord = nil)"]];
_syncModels 到底如何从 NSMutableArray 更改为 NSConcreteData?
这种特殊的崩溃很少见,但我们会遇到更多这样的崩溃,其中一些对象被打乱并被发送一条无法处理的消息。
我们的目标是 ARC 下的 6.1。
编辑
我发现了问题...我无意中将self(拥有对_syncModels 的引用)从self 的dealloc 方法添加到调度队列...所以这是一个内存管理问题...
【问题讨论】:
-
首先,看看this other SO answer 关于 NSConcreteData 和类集群(这就是 NSMutableArray 是什么)。然后向我们提供有关您在
_syncModels中存储的对象类型的更多信息。您的错误实际上与 NSConcreteData 无关,但它很可能存在于您所持有的对象和您正在创建的谓词中。 -
@sosborn -
NSMutableArray不是NSConcreteData的类簇吗?我插入到这个数组中的对象都是相同的类型,并且它们具有在我的谓词中引用的属性。我的单元测试每次都通过。 -
我的猜测是 NSConcreteData 实例实际上引用了您在数组中收集的对象之一中的属性。您是否有可能在其中有一个不响应
dataManagerFieldRecord的对象?
标签: objective-c memory-management automatic-ref-counting