我有一个导航控制器基于应用程序,我遇到一个奇怪的问题,其中一些我的视图控制器推的是基于“啪”的视图控制器导致崩溃。

我范围缩小到的代码,将其推导航控制器的堆栈上之后释放视图控制器的行。

我的代码看起来是这样的:

SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];  //offending line

现在这个的的正确的内存管理代码,但不幸的是我得到了“双免费发送到实例0X .....”错误(在某些情况下)和我的应用程序崩溃。此当我弹出所述视图控制器通常会发生。

我在寻找的建议上看看。我卡。

预先感谢。

修改:这里是由Louis建议堆栈跟踪转储的结果以下

在第一版本中,保留计数是13(I深处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])。然后将保留只计算它对2和实例无法dealloc'ed

有帮助吗?

解决方案

据被释放其他地方。如果你想看到谁在呼唤它,你可以在发行刚刚突破调用的类。另一种选择是在释放打印出堆栈跟踪:

#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];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top