iOS NSCalendar崩溃 - 参考问题?

时间:2014-07-08 05:13:48

标签: ios automatic-ref-counting release retain nscalendar

我看到了很多崩溃,所有的表现都略有不同,但他们都指向同一行代码,我有预感,但它有点超出我的舒适区,所以我想要一些帮助。

崩溃与NSCalendar的组件有关:fromDate。

在有问题的课程中,有一个NSCalendar的实例变量,在我的init方法中我调用

calendar = [NSCalendar autoupdatingCurrentCalendar];

后来我打来电话:

NSDateComponents *components = [calendar components:myComponents fromDate:myDate];

以上行是发生崩溃的地方,在查看崩溃日志时,我看到这一行的错误组合:

  • EXC_BAD_ACCESS KERN_INVALID_ADDRESS
  • [__ NSCFNumber组件:fromDate:]:无法识别的选择器发送到实例
  • NSInvalidArgumentException [__NSDate components:fromDate:]:发送到实例的无法识别的选择器
  • SIGABRT ABORT

我已经检查过,除了在init方法中初始创建日历变量之外,我没有更改日历变量。正如我所说,我没有在代码中的任何地方修改日历变量,我也无法复制任何其他问题,但我通过执行以下操作来复制第二次崩溃:

NSCalendar *calendar = @5;
NSDateComponents *components = [calendar components:myComponents fromDate:myDate];

这可能是某种内存引用问题吗?我在几年前的ARC之前看过类似的问题报道(我从来没有做过任何没有ARC的事情),人们没有正确地保留他们的变量。这可能是某种问题,其中实例变量未被正确保留,使内存处于错误状态,导致这些奇怪且看似截然不同的问题,但都在同一个地方?非常感谢任何和所有信息。

编辑:我将补充一点,这是一个罕见/间歇性崩溃报告崩溃,我无法复制到本地调试不止一次,这是让我相信它是一个内存管理问题或者也许是线程问题。

第二次编辑:我正在回顾一下我曾经在Xcode中遇到过这个问题的一些截图/日志内容,我想我错过了一些东西。

如果我在该行设置断点,并打印日历对象:

po calendar
0x14d50a20

如果我通常在一个全新的[NSCalendar autoupdatingCurrentCalendar]上做一个po,我得到:

  

自动更新日历[< _NSCopyOnWriteCalendarWrapper:0x10922ae80>]

这是否意味着,如果它只是一个地址,那么对象就像我原先预期的那样丢失了?

2 个答案:

答案 0 :(得分:0)

虽然Ritu对此有所了解,但值得一提的还有更多。我仍然不确定这是一个内存问题,一个线程问题,还是两者的结合(非常可能),但每次我需要解决问题时,直接删除实例变量并直接访问autoupdatingCurrentCalendar。这是因为每次调用[NSCalendar autoupdatingCurrentCalendar]都会返回一个唯一实例,这是我原本不会想到的。

因此,摆脱NSCalendar实例变量并通过调用获取autoupdatingCurrentCalendar来替换对该变量的每个调用将解决从多个线程访问相同引用的任何问题,以及该对象是否会被损坏,丢失,出于任何原因等等。

答案 1 :(得分:-2)

您应该使用:

     NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
     NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]];