我有一个基于导航控制器的应用程序,我遇到了一个奇怪的问题,我的一些视图控制器推送在“弹出”视图控制器时导致崩溃。
我把它缩小到在导航控制器的堆栈上推送后释放视图控制器的代码行。
我的代码如下所示:
SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release]; //offending line
现在这个是正确的内存管理代码,但不幸的是我得到了“双重免费发送到实例0x .....”错误(在某些情况下)并且我的应用程序崩溃了。当我弹出所述视图控制器时,通常会发生这种情况。
我正在寻找有关应该注意什么的建议。我被卡住了。
提前致谢。
编辑:这是Louis在下面建议的堆栈跟踪转储的结果。
在第一次发布时,保留计数为13(我猜是由于CocoaTouch基类中的一些代码)。最终它归结为:
#2009-08-06 22:33:18.304 My App [26601:20b] ** RELEASE CALLED ** 2009-08-06 22:33:18.306 My App [26601:20b] Retain count was : 1 0 My App 0x000033ec start + 4700 1 CoreFoundation 0x302042e8 CFRelease + 136 2 CoreFoundation 0x30227249 CFNumberGetValue + 2937 3 CoreFoundation 0x30204421 _CFRelease + 241 4 Foundation 0x30506515 NSPopAutoreleasePool + 341 5 QuartzCore 0x00b5436e CA_CGRectUnapplyInverseTransform_ + 19738 6 QuartzCore 0x00b54109 CA_CGRectUnapplyInverseTransform_ + 19125 7 CoreFoundation 0x302454a0 CFRunLoopRunSpecific + 3696 8 CoreFoundation 0x30244628 CFRunLoopRunInMode + 88 9 GraphicsServices 0x32044c31 GSEventRunModal + 217 10 GraphicsServices 0x32044cf6 GSEventRun + 115 11 UIKit 0x309021ee UIApplicationMain + 1157 12 My App 0x00002258 start + 200 13 My App 0x000021c6 start + 54 14 ??? 0x00000001 0x0 + 1 2009-08-06 22:33:18.307 My App [26601:20b] ########### DEALLOC
objc[26601]: FREED(id): message retainCount sent to freed
对象= 0xd09070
如果我省略上面的违规行([viewController release];),那么保留计数只会使它为2,并且实例永远不会被释放。
答案 0 :(得分:0)
它正在其他地方发布。如果你想看看谁在调用它,你可以打破对该类的释放调用。另一种选择是在版本中打印出堆栈跟踪:
#include <execinfo.h>
#include <stdio.h>
- (void) release {
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i < frames; ++i) {
printf("%s\n", strs[i]);
}
free(strs);
[super release];
}