2009-08-05 9 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

Iは、上記の問題の行省略([ViewControllerをリリース];)をカウントを保持しますそれを2にするだけで、インスタンスは決してdeallocされません。

答えて

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

私が家に帰るとき、私は –

+0

は、この結果に疑問を更新...これを試してみましょう... –

+0

これは最終的に私が把握助けこの問題は、アプリの別の場所で二重にリリースされたラベルだった。 –

関連する問題