2009-08-05 129 views
0

我有一個基於導航控制器的應用程序,我遇到了一個奇怪的問題,其中一些視圖控制器按下「彈出」視圖控制器時導致崩潰。當我「正常」釋放推視圖控制器時,iPhone崩潰

我已經將它縮小到在推動導航控制器堆棧後釋放視圖控制器的代碼行。

我的代碼如下所示:

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

現在這個正確的內存管理代碼,但不幸的是我得到了「雙免費發送到實例0X .....」錯誤(一些情況)和我的應用程序崩潰。這通常發生在我彈出視圖控制器時。

我在尋找什麼建議。我卡住了。

在此先感謝。

編輯:這裏是路易斯建議的堆棧跟蹤轉儲的結果如下。

第一次發佈時,保留計數是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釋放]),則保留計數僅使其爲2,並且該實例從未被釋放。

回答

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]; 
} 
+0

我會嘗試這個,當我回家... – 2009-08-05 14:12:14

相關問題