我当前正在处理的代码需要将 NSNumber 对象添加到数组中。所有值为 0-12 的 NSNumber 都可以正常添加,但 13 以后会导致 EXC_BAD_ACCESS。我打开 NSZombieEnabled 现在得到*** -[CFNumber retain]: message sent to deallocated instance 0x3c78420
.
这是调用堆栈:
#0 0x01eac3a7 in ___forwarding___
#1 0x01e886c2 in __forwarding_prep_0___
#2 0x01e3f988 in CFRetain
#3 0x01e4b586 in _CFArrayReplaceValues
#4 0x0002a2f9 in -[NSCFArray insertObject:atIndex:]
#5 0x0002a274 in -[NSCFArray addObject:]
#6 0x00010a3b in -[Faves addObject:] at Faves.m:24
#7 0x000062ff in -[ShowController processFave] at ShowController.m:458
#8 0x002af405 in -[UIApplication sendAction:to:from:forEvent:]
#9 0x00312b4e in -[UIControl sendAction:to:forEvent:]
#10 0x00314d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#11 0x00313abb in -[UIControl touchesEnded:withEvent:]
#12 0x002c8ddf in -[UIWindow _sendTouchesForEvent:]
#13 0x002b27c8 in -[UIApplication sendEvent:]
#14 0x002b9061 in _UIApplicationHandleEvent
#15 0x02566d59 in PurpleEventCallback
#16 0x01e83b80 in CFRunLoopRunSpecific
#17 0x01e82c48 in CFRunLoopRunInMode
#18 0x02565615 in GSEventRunModal
#19 0x025656da in GSEventRun
#20 0x002b9faf in UIApplicationMain
#21 0x00002498 in main at main.m:14
如果它没有隔离到一定范围的 NSNumbers,我会认为我的内存管理搞砸了,但我就是不知道。
有任何想法吗?
Thanks,
Josh
我在回答另一个问题时发现数字 0 到 12 很特殊here。请记住,这是一个实现细节,not语言规范的东西。
基本上,最大(包括)12 的数字为您提供对已经存在的 NSNumber 的引用,由于它们是不可变的,因此这是可能的。调查显示,13 或更大的数字给出了一个单独的实例。
所以你可能have毕竟搞砸了你的内存管理:-) 事实上,小于 13 的数字很可能引用了已经存在的数字,在这种情况下,这可以节省你的培根。我建议您发布更多代码,以便我们可以找到该特定问题。
根据您对此处另一个答案的评论:
我在代码中添加了一条保留行,现在一切正常。不知道为什么。我就顺其自然吧。谢谢!
我认为您会发现,在您获得自己的保留计数之前,小于 13 的 NSNumbers 的保留计数已经为 1(将计数增加到 2),这就是它们不会导致 EXC_BAD_ACCESS 的原因。显然你的代码正在丢失all您分配的号码,但系统不会释放 13 岁以下的号码,因为它们仍在使用中(保留 1 或更多的计数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)