malloc错误 - [CFString发布]

时间:2011-01-19 10:37:54

标签: iphone

出于某种原因,我的应用程序崩溃了特定的操作。经过调查,我发现这是因为释放了已经释放的东西。然后我在网上看到我可以使用我实现的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

现在我无法找出导致崩溃的原因。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

如您所知,您正在对已经销毁的对象调用release。也就是说,你在对象上调用了release一次太多(在本例中是一个NSString)。通过NSZombieEnabled完成的例外现在可以告诉您“一次性太多”发布的位置。但是大部分时间你都在寻找中间版本,而这很难做到......

既然您知道崩溃的位置(因此应该知道涉及哪个变量),您需要通读代码,同时释放此变量或将对象分配给该变量,然后检查这些源。也就是说,您需要“回溯”对象源自哪里以及您使用它做了什么。在其生命的某个地方,您要么忘了retain它,要么忘记了release / autorelease你不应该去的地方。

答案 1 :(得分:0)

验证您对该字符串的alloc / release。 alloc + retain的数量必须等于release的数量。 不要释放自动释放对象。