【问题标题】:What condition would cause an iVar to change its type?什么条件会导致 iVar 更改其类型?
【发布时间】: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 的引用)从selfdealloc 方法添加到调度队列...所以这是一个内存管理问题...

【问题讨论】:

  • 首先,看看this other SO answer 关于 NSConcreteData 和类集群(这就是 NSMutableArray 是什么)。然后向我们提供有关您在_syncModels 中存储的对象类型的更多信息。您的错误实际上与 NSConcreteData 无关,但它很可能存在于您所持有的对象和您正在创建的谓词中。
  • @sosborn - NSMutableArray 不是NSConcreteData 的类簇吗?我插入到这个数组中的对象都是相同的类型,并且它们具有在我的谓词中引用的属性。我的单元测试每次都通过。
  • 我的猜测是 NSConcreteData 实例实际上引用了您在数组中收集的对象之一中的属性。您是否有可能在其中有一个不响应 dataManagerFieldRecord 的对象?

标签: objective-c memory-management automatic-ref-counting


【解决方案1】:

什么条件会导致 iVar 改变其类型?

我能想象的唯一情况是程序员在源代码中修改了它的类型并重新编译。

你的意思是存储在ivar中的指针指向的对象被改变了。这是一个典型的内存管理错误,一般意味着你期望的对象在那里已经过早地释放了(因为你没有保留足够的引用),然后运行时在需要创建新对象时重用其底层内存块。

【讨论】:

  • 是的......你的大胆陈述比我的问题更准确(和简洁)。但是,这个特定的 iVar 是类私有的,导致崩溃的特定方法也是私有的。该类正在执行内部对象的内部操作。我不明白这个对象在什么时候被过早地释放,因为一旦我在我的类的 init 方法中分配/初始化它,我就永远不会改变它。
  • @TReddy 我看不到这种关系。 “内部”对象不需要像“公共”对象一样进行内存管理吗?
  • 抱歉造成混淆...我试图传达的是,当我使用术语“内部对象”时,除了拥有类之外,没有其他任何东西可以引用这个 iVar。所以除了这个类之外没有其他东西可以修改这个对象,并且这个对象在类完成之前不会被释放。
  • @TReddy 是覆盖类变量的方法之一的参数?检查您的警告
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多