我目前正在处理的代码需要将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,我会假设我搞砸了我的记忆管理,但我不知道。
有什么想法吗?
谢谢,
约什
答案 0 :(得分:11)
我回答另一个问题here时发现,数字0到12很特别。请记住,这是一个实现细节,不是语言规范。
基本上,最多(包括)12的数字会给你一个已经存在的NSNumber的引用,这可能是因为它们是不可变的。调查显示,13或更高的数字给出了一个单独的实例。
所以你可能已经搞砸了你的记忆管理:-)只是这个数字少于13的事实可能会引用已经存在的数字,在这些情况下可以节省你的培根。我建议您发布更多代码,以便我们可以追踪该特定问题。
根据你对另一个答案的评论:
我在代码中添加了一条保留行,现在一切正常。不知道为什么。我只想和它一起滚动。谢谢!
我认为你会发现NSNumbers少于13的事实在你获得自己的数量之前已经有一个保留计数为1(将计数提高到2)这就是为什么它们不会导致EXC_BAD_ACCESS。显然,您的代码正在丢失所有您分配的数字,但系统不会释放那些13岁以下的人,因为他们仍然在使用(保留计数为1或更多)。
答案 1 :(得分:2)
显然,NSNumbers> 12将保留。我建议你写一个非常小的程序来证明这一点。然后接受该程序,使其成为一个函数,并在程序的早期调用它。慢慢将函数移动到程序中的后续点,直到出现错误。因此,您将找到真正的错误。