2011-10-20 7 views
2

私はObjective Cを使って多くのことを遅らせています。メモリ管理とそれがニュアンスであることを理解することはこれまでの課題です。メモリ管理の特徴! NSNumberとの関係で

私が作成するすべてのオブジェクトは、所有権を持ち、一度使用したら解放する必要があることを理解していますか? (私が間違っている場合は正しい)。コアの問題に:

のは、私は方法/メッセージは、NSMutableArrayに存在する値を変更するにはターンの値を利用するように回すとdoSomethingニーズ効果に何かを言うインターフェースは、ブール変数を持っている-(void)doSomething; と呼ばれてきたとしましょうオフ:

[[matrix objectAtIndex:1] replaceObjectAtIndex:1 withObject:turn]; 

'turn'はオブジェクトではないため、これは機能しません。だから私は、転送方法は、順番に値を使用してBOOL値として初期化されたNSNumberオブジェクトを作成することだと思います。

-(void)doSomethingメッセージが複数回送信されます。これは、受信者に送信されるたびに、NSNumberオブジェクトが再作成され、その値が変更されていることを意味します(これはすべて私にとって魅力的なものです)。

私の質問では、メッセージが受信者に送信されるたびにNSNumberオブジェクトをリリースする必要がありますか?本質的に私は予見しているメモリ管理の課題について、ここで大きな脳のダンプが必要です!!!

P.S:これを書いて、各メッセージコールの終わりにオブジェクトをリリースする必要があると思いますが、入力したので、私はあなたの意見も得ています。

ありがとう、メガトンの人々!

答えて

1

NSArraysは、独自のメモリ管理を処理します。オブジェクトを配列に追加すると、オブジェクトが配列から削除されるまで保持されます。

[[matrix objectAtIndex:1] replaceObjectAtIndex:1 withObject:turn]; 

ここでは、配列に 'turn'を追加しているので、それを保持します。このオブジェクトの所有権を持っていれば、それをリリースすることができます。便利な方法で作成した場合は、すでに自動リリースされています。

1

このコード:

[NSNumber numberWithBool:turn]; 

が自動解放NSNumberオブジェクトを作成します。それは、それが範囲外になると解放されることを意味します。その後、この呼び出し:

[[matrix objectAtIndex:1] replaceObjectAtIndex:1 withObject:[NSNumber numberWithBool:turn]]; 

は、新しいオブジェクトを配列に設定します。配列はオブジェクトを保持するので、のの表現は、オートレリースされたときに有効です(以前は配列によって保持されていました)。将来の値はturnにはなりません。

1

1)手動メモリ管理を避けるには、ARCを使用します。

しかし、あるメソッドから別のメソッドにオブジェクトを渡すと、ではなくが再作成されますが、オブジェクトへのアドレスがメソッドに渡されます。

あなたの場合は、オートレリースされたNSNumberオブジェクトを作成して、すべてのメソッドを渡す必要があります。そして、配列に格納されると、配列はそれを保持します。

0

NJonesの答えを少し拡張するために、Cocoaには、オブジェクトの所有者のための規約がよく定義されています(here参照)。最後にオブジェクトはポインターなので、ポインタを渡すと指している値ではなくポインタだけがコピーされます。