出于某种原因,我的应用程序崩溃了特定的操作。经过调查,我发现这是因为释放了已经释放的东西。然后我在网上看到我可以使用我实现的NSZombie和MallocStackLogging来查找原因,并将其作为结果。
NSZombie:2011-01-19 14:39:09.523 iota [13649:207] * - [CFString 发布]:发送到解除分配的消息 实例0xeeaf510 malloc_history
ALLOC 0xeeaf510-0xeeaf52f [size = 32]: thread_a0041500 |开始|主要| UIApplicationMain | GSEventRun | GSEventRunModal | CFRunLoopRunInMode | CFRunLoopRunSpecific |的 CFRunLoopRun | __CFRunLoopDoTimer | __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION | __NSFireDelayedPerform | - [UITableView _userSelectRowAtIndexPath:] | - [UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] | - [CorpDirViewController tableView:didSelectRowAtIndexPath:] | - [CorpDirPersonViewController corpDirViewController:shouldContinueAfterSelectingContact:] | - [ContactItem mergeWithContact:] | - [ContactItem getValueForProperty:] | ABRecordCopyValue | CPRecordCopyProperty | CPRecordGetProperty | ABCMultiValueLoad | ABCDBContextFetchMultiValuePropertyIntoRecord | ABCDBContextFetchMultiValueEntries | CPSqliteStatementSendResults | CollectMultiValueEntries | _sqliteStatementApplyValuesFromRecordWithNullValue | CFStringCreateWithCString | __CFStringCreateImmutableFunnel3 | _CFRuntimeCreateInstance | malloc_zone_malloc
现在我无法找出导致崩溃的原因。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
如您所知,您正在对已经销毁的对象调用release
。也就是说,你在对象上调用了release
一次太多(在本例中是一个NSString)。通过NSZombieEnabled完成的例外现在可以告诉您“一次性太多”发布的位置。但是大部分时间你都在寻找中间版本,而这很难做到......
既然您知道崩溃的位置(因此应该知道涉及哪个变量),您需要通读代码,同时释放此变量或将对象分配给该变量,然后检查这些源。也就是说,您需要“回溯”对象源自哪里以及您使用它做了什么。在其生命的某个地方,您要么忘了retain
它,要么忘记了release
/ autorelease
你不应该去的地方。
答案 1 :(得分:0)
验证您对该字符串的alloc / release。 alloc + retain的数量必须等于release的数量。 不要释放自动释放对象。