10

次のように、TableViewController の didSelectRowAtIndexPath メソッド内からビュー コントローラーをナビゲーション コントローラーのスタックにプッシュしています。

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
MyObject *myO = (MyObject *)[appDelegate.myOs objectAtIndex:indexPath.row];
myViewController.amount = myO.amount;
[self.navigationController pushViewController:myViewController animated:YES];
[myViewController release];

最後の行のコメントを外すと、アプリがクラッシュしてエラーが返されます。

-[CALayer release]: message sent to deallocated instance 0xd4f860

もう少し掘り下げてみると、クラッシュは MyViewController の dealoc メソッド内の [super dealoc] への呼び出しにさらに絞り込むことができることがわかりました。"[super dealoc]" のコメントを外すと、クラッシュしなくなります。

これ以上絞り込めなくて困っています。「スーパー」はUIViewControllerクラスであり、そのdealocメソッドをさらに調査することはできません...できますか? 0xd4f860 が何を指していたのかを正確に確認する方法があるかもしれませんが、その方法はわかりませんか? 何か案は?

4

1 に答える 1

4

あなたは間違った場所を見ています - 問題は、myViewController が何度も解放 (または自動解放) されていることです。

あなたが投稿したコードは正しいように見えるので、MyViewController のコードを調べて、それ自体が解放されるかどうか、または何らかの方法で他の方法で解放されるかどうかを確認します。

release メソッドをオーバーライドし、ブレークポイントを設定して、その方法で絞り込めるかどうかを確認することもできます...

- (void)release {
    [super release]; //Set breakpoint here
}
于 2009-07-22T18:57:26.823 に答える