2009-08-01 20 views
1

まず、obj-Cでメモリがどのように動作するかについての記事を読んだあと、どこでも "self"を配置し始めて以来、私のアプリではそれほど多くのメモリの問題は見たことがありません。さて、私はあらゆる種類の問題を抱えています(私のコーディングの不器用さを明らかにします)。私がObjective-Cの初心者であることを認めても、私は人生の中でこれまでにメモリ管理に関して大きな問題を抱えたことはないと認めます。しかし、私はそれに慣れて練習を取ると思う。UINavigationViewControllerメモリ解放

今、私の質問に。

私は上記のコントローラへの参照を保持するクラスインタフェースプロパティ(self.todoCreate)を持っています。このコントローラーは、ボタンを押すことによってナビゲートされます。

@property (nonatomic, retain) TodoTaskCreateController *todoCreate; 

次のコードは、ナビゲーションビューの変更が生じるの抜粋です:だからここ

TodoTaskCreateController *viewController = [[TodoTaskCreateController alloc] 
        initWithNibName:@"TodoTaskCreateController" 
          bundle:[NSBundle mainBundle]]; 

self.todoCreate = viewController; 
[viewController release]; 
// slide-in todoCreate controller. 
if (self.navigationController != nil && self.todoCreate != nil) { 
    [self.navigationController pushViewController:self.todoCreate animated:YES]; 
} 

は私の問題です:

私はそれが動作これを最初に実行したとき。 2回目のビュー画面に入ると、メインビューに戻ります。 また2回目に再度ナビゲートしようとすると、self.todoCreateviewControllerが割り当てられているところでアプリがクラッシュします。

メインビューのviewDidAppearメソッドでは、[self.todoCreate release]を呼び出します。

誰でもこれを説明できますか?

PS - 多くのiPhoneアプリがランダムにクラッシュすることは間違いありません。

答えて

0

私はすぐに話すつもりはありませんが、viewControllerをautoreleaseプールに追加し、そのリリースのすべての手動発生を削除することでクラッシュを解決しました。

createTodoの@propertyが(非原子的、代入的)ではなく(非原子的、保持)として定義されているかどうかは今問題ですか?今すぐあなたのviewDidAppear方法はどの時点保持カウントでself.todoCreateを解放さ

- (void) setTodoCreate:(Foo*) newVal 
{ 
    [todoCreate release]; // release the previous object 
    todoCreate = [newVal retain]; // point to new object, and also retain it 
} 

+0

もし 'self。todoCreate = 'に' retain'プロパティを指定すると、古い値が解放されます。 'assign'プロパティで同じことをすると、古い値は解放されません。 –

+0

ちょっと待って、あなたの説明どおりに正反対の振る舞いをしていると思った。 retainは参照カウントをインクリメントするので、retainで記述されたプロパティは解放されませんか?しかし、もう一度、ちょうど私が物事のハングアップを持っていると思ったとき、このような何かがそれを私の理解を揺さぶる。非常にイライラ。 –

1

todoCreateは、あなたがそれに値を割り当てるときに、それがメソッドを呼び出す意味プロパティは、のようになりますどのsetTodoCreateと呼ばれていますtodoCreateの新しいTodoTaskCreateControllerを作成し、0

代わりののカウントを保持して、別のreleaseが、この時間は、オブジェクトに対して行われるが、self.todoCreateに代入すると0です。の場合は、self.todoCreate = nilを使用してください。

TodoTaskCreateControllerのいずれかを継続的に破棄して作成しないでください。

アプリケーションのクラッシュに関するご意見は、アプリケーションがメモリ警告を正しく処理しているかどうかをテストしていない開発者が原因である可能性があります。シミュレータには、これをシミュレートするためのメニューオプションがあり、アプリケーションはすべてのの警告を「生き残る」必要があります。

関連する問題