iOS NSCalendar崩溃-引用问题?

iOS NSCalendar崩溃-引用问题?,ios,automatic-ref-counting,release,retain,nscalendar,Ios,Automatic Ref Counting,Release,Retain,Nscalendar,我看到了一些崩溃,所有的表现形式都略有不同,但它们都指向同一行代码,我有预感,但这有点超出了我的舒适区,所以我需要一些帮助 崩溃与NSCalendar的组件有关:fromDate 在所讨论的类中,有一个NSCalendar的实例变量,在我的init方法中,我调用 calendar = [NSCalendar autoupdatingCurrentCalendar]; 稍后我呼吁: NSDateComponents *components = [calendar components:myCom

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

崩溃与NSCalendar的组件有关:fromDate

在所讨论的类中,有一个NSCalendar的实例变量,在我的init方法中,我调用

calendar = [NSCalendar autoupdatingCurrentCalendar];
稍后我呼吁:

NSDateComponents *components = [calendar components:myComponents fromDate:myDate];
上面这一行是崩溃发生的地方,当查看崩溃日志时,我看到这一行的错误组合:

EXC\u错误\u访问内核\u无效\u地址 [\uu NSCFNumber components:fromDate:]:发送到实例的选择器无法识别 NSInvalidArgumentException[\u NSDate组件:fromDate:]:发送到实例的选择器无法识别 SIGABRT中止 我已经检查过了,除了在init方法中初始创建日历变量之外,我不会在任何地方更改它。正如我所说,我没有在代码中的任何地方修改calendar变量,也无法复制任何其他问题,但我通过执行以下操作复制了第二次崩溃:

NSCalendar *calendar = @5;
NSDateComponents *components = [calendar components:myComponents fromDate:myDate];
这可能是某种内存引用问题吗?我在几年前ARC发布的文章中也看到过类似的问题,我从来没有做过任何没有ARC的事情,遗憾的是,人们没有正确地保留他们的变量。这可能是某种类型的问题吗?实例变量没有被正确地保留,使内存处于不好的状态,导致这些奇怪的、看起来不同的问题,但都在同一个地方?非常感谢您提供的所有信息

编辑:我要补充的是,这是crashlytics报告的罕见/间歇性崩溃,我无法多次复制到本地调试,这让我相信这可能是内存管理问题,也可能是线程问题

第二次编辑:当我在Xcode中发现这个问题时,我回顾了一些截图/日志,我想我错过了一些东西

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

po calendar
0x14d50a20
如果我通常在全新的[NSCalendar AutoUpdate CurrentCalendar]上进行采购订单,我会得到:

自动更新日历[]

这是否意味着在它只是一个地址的情况下,正如我最初预期的那样,对象丢失了?

您应该使用:

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

虽然丽图想到了这一点,但还有更多值得一提的地方。我仍然不确定这是否是内存问题、线程问题,或者两者的结合。很有可能,但每次我需要解决这个问题时,都要去掉实例变量并直接访问AutoUpdate CurrentCalendar。这是因为每次调用[NSCalendar AutoUpdate CurrentCalendar]都会返回一个唯一的实例,这是我最初没有想到的


因此,去掉NSCalendar实例变量,并用获取AutoUpdatengCurrentCalendar的调用替换对该变量的每次调用,可以解决从多个线程访问同一引用以及对象是否已损坏、丢失、释放等问题。,无论出于何种原因。

我不知道您在做什么,但这些崩溃是因为您试图在NSNumber上调用方法“components:…”,然后在NSDate上调用。我不明白你为什么要将日历设置为@5,这意味着你要将它设置为NSNumber。如果你在麻烦行之前记录日历,它会给你带来什么。你正在使用初始化组件的方法中使用组件。因此,右边的组件是未初始化的。当然,您可以在每次使用日历之前立即提取日历来回避这个问题。这是一个很难解决的问题。我今天正在做一些类似但不完全相同的事情,我认为这是由于一些UI访问不是从主线程完成的。当然,如果您支持iOS 6,那么这些NSCalendarfactory调用可能会非常昂贵。我使用的是currentCalendar,而不是自动更新的日历。我发现,在6岁以下的时候,在线程字典中粘贴一个副本,可以减少10%的显示时间,使一个小表格的显示时间与日期计算相关。7岁以下无差异;苹果似乎已经解决了这个问题。幸运的是,我只支持iOS7,但这绝对是个好消息!