gpt4 book ai didi

iPhone开发-内存释放问题

转载 作者:行者123 更新时间:2023-12-03 18:50:42 28 4
gpt4 key购买 nike

我遇到了释放已释放对象的问题,但我无法找出错误发生的位置。我添加了 NSZombieEnabled 标志,这是我在 gdb 中获得的日志。有人可以告诉我如何解决此问题,或者找出错误发生的位置。

*** -[CFString release]: message sent to deallocated instance 0x5e4780 
(gdb) where
#0 0x952ff907 in ___forwarding___ ()
#1 0x952ffa12 in __forwarding_prep_0___ ()
#2 0x9260e20f in NSPopAutoreleasePool ()
#3 0x30a564b0 in _UIApplicationHandleEvent ()
#4 0x31563dea in SendEvent ()
#5 0x3156640c in PurpleEventTimerCallBack ()
#6 0x95280615 in CFRunLoopRunSpecific ()
#7 0x95280cf8 in CFRunLoopRunInMode ()
#8 0x31564600 in GSEventRunModal ()
#9 0x315646c5 in GSEventRun ()
#10 0x30a4ec98 in -[UIApplication _run] ()
#11 0x30a5a094 in UIApplicationMain ()
#12 0x00002494 in main (argc=1, argv=0xbfffef9c) at /Users/adminUser/Projects/MyProject/main.m:14

谢谢。

最佳答案

自动释放池正在尝试释放已经释放的对象。

如果您手动释放注册为自动释放的对象,就会发生这种情况

NSString* foo = [NSString stringWithFormat:@"foo:%d",42];  
[foo release]; /* this release is bad, as this object is already
registered for autorelease */

您可以使用以下方法,找到分配点:

  1. 设置MallocStackLogging, MallocStackLoggingNoCompact环境为 1。
  2. 运行程序,一旦它进入 gdb 使用 malloc_history从 shell 找出分配的堆栈跟踪:malloc_history <pid> <addr> 。 (NSZombieEnabled会打印出gdb中的地址)

另一个选项(不太可能降低运行时性能)是将 Instruments 工具与“Zombies”模板结合使用。它将跟踪僵尸并告诉您僵尸的历史,而无需使用 malloc_history 命令。

关于iPhone开发-内存释放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/482400/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com