2009-08-21 16 views
2

私は奇妙なバグがあります。どのようにトラッキングするのか分かりません。私はSimmulator 3.0でアプリを実行しています。 tabBarcontrollerには3つのタブがあり、それらをtab1、tab2、およびtab3と呼ぶことにしましょう。 3つのタブはすべてカスタマイズされたグループ化されたテーブルのサブクラスです。 tab1とtab3の間を無期限に前後にクリックすると、問題はありません。ただし、tab1またはtab3からtab2までをちょうど5回クリックすると、tab1またはtab3をクリックした後にプログラムがクラッシュします。私はこれを行うとき、私は(ほとんど同じ)二つの異なるバックトレースを持っていた:プログラムがタブ間で切り替わるとクラッシュする5回

backtrace1:

objc[2988]: FREED(id): message release sent to freed object=0xfec100 
Program received signal: “EXC_BAD_INSTRUCTION”. 
(gdb) backtrace 
#0 0x92a2dbfa in _objc_error() 
#1 0x92a2dc30 in __objc_error() 
#2 0x92a2c637 in _freedHandler() 
#3 0x302042e8 in CFRelease() 
#4 0x00370c31 in CALayerUpdateSublayers() 
#5 0x0036f173 in -[CALayer dealloc]() 
#6 0x0036100e in CALayerRelease() 
#7 0x00369dad in CALayerFreeTransaction() 
#8 0x003620b8 in CA::Transaction::commit() 
#9 0x0036a2e0 in CA::Transaction::observer_callback() 
#10 0x30245c32 in __CFRunLoopDoObservers() 
#11 0x3024503f in CFRunLoopRunSpecific() 
#12 0x30244628 in CFRunLoopRunInMode() 
#13 0x32044c31 in GSEventRunModal() 
#14 0x32044cf6 in GSEventRun() 
#15 0x309021ee in UIApplicationMain() 
#16 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14 

backtrace2:私は複製できるようにするには至っていない

Program received signal: “EXC_BAD_ACCESS”. 
(gdb) backtrace 
#0 0x92a3d688 in objc_msgSend() 
#1 0x302042e8 in CFRelease() 
#2 0x00370c31 in CALayerUpdateSublayers() 
#3 0x0036f173 in -[CALayer dealloc]() 
#4 0x0036100e in CALayerRelease() 
#5 0x00369dad in CALayerFreeTransaction() 
#6 0x003620b8 in CA::Transaction::commit() 
#7 0x0036a2e0 in CA::Transaction::observer_callback() 
#8 0x30245c32 in __CFRunLoopDoObservers() 
#9 0x3024503f in CFRunLoopRunSpecific() 
#10 0x30244628 in CFRunLoopRunInMode() 
#11 0x32044c31 in GSEventRunModal() 
#12 0x32044cf6 in GSEventRun() 
#13 0x309021ee in UIApplicationMain() 
#14 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14 

backtrace2は時計の仕事と同じですが、backtrace1と同じです。

1) "tabBarController.selectedIndex"を使用してプログラム間でタブを切り替えると はアプリケーションをクラッシュさせません - アプリケーションをクラッシュさせるためにタブを手動で選択する必要があります。 2)メインとは別に、バックトレースに表示されているコードは表示されません。バックトレースに示されているメインのコードの行は、私がこのバグを解決するために見て開始する必要があります

int retVal = UIApplicationMain(argc, argv, nil, @"AnAppDelegate"); 

のですか?

答えて

1

スタックトレースに基づいて、OSは1つのビューから次のビューへの移行を完了し、すでに割り当てが解除されているものをクリーンアップしようとしています。私の推測では、あなたのアプリケーションとOSの両方が保持しているものがありますが、あなたがそれを保持している以上にあなたの側を解放したため、その後OSがクラッシュすることがあります。最初のバックトレースは、すでに解放されているオブジェクトを解放するダブルフリーです。もう1つはもう存在しないオブジェクトにメッセージを送信しようとしています。

+0

私は何がうまくいかないのか分かったと思います。私は3つのタブすべてでカスタムセルを使用し、セルを-autoreleaseで作成します。しかし、tab2では次のようなことしかしませんでした:TitledCell * aCell = [[codeToInitCell] autorelease]; cell = aCell;一方、tab1とtab3ではセルを直接設定します。私はaCellが「将来のある時点で」リリースされたと推測していますが、その後アプリはセルをリリースしようとしました。それは正しいと思いますか? – JoBu1324

+0

それは犯人かもしれなかった。 – fbrereto

0

(私は答えスロットを使用していたコメントできない)

私は、カスタムテーブルのセルを使用して、同様の問題を抱えています。私の細胞がbased on the tutorial found here作成されます(12:02分前方に最も関連している):

MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"MyTableCellView" owner:self options:nil]; 
    cell = self.myTableCell; 
} 

私はその所有者がTableViewControllerを指摘しているMyTableCellView.xibを持っています。コントローラには、myTableCellのIBコンセントがあります。

私は何の問題も/リークもありません。 Clang/LLVMは問題ありません。私はシミュレータの "Simulate memory warning"でストレステストをしています。あなたのようなエラーで毎回アプリがクラッシュします。

EDIT

は、最後にそれを考え出しました!

IBOutletdidReceiveMemoryWarningには(viewDidUnloadと同様)除外しないとわかりませんでした。

メモリ通知後にメインビューに戻るときに「フリッカー」がないように、フリップバックの前に再び表示されることをお勧めします。

関連する問題