2

私はポインターランドで迷子になっていると思います。私はこれを持っています (コード構文が少しずれている可能性があります。このコードを搭載したマシンは見ていません...しかし、関連する詳細はすべて正しいです):

NSMutableArray *tmp = [[NSMutableArray alloc] init];

私は彼らがそれを別のクラスのルーチンに渡します

- (BOOL)myRoutine: (NSMutableArray *)inArray
{
    // Adds items to the array -- if I break at the end of this function, the inArray variable has a count of 10
}

しかし、コードが呼び出しルーチンに戻ると、[tmp count] は 0 です。

私は何か非常に単純でありながら非常に基本的なものを見逃しているに違いありませんが、私の人生ではそれを見ることができません。誰かが私が間違っていることを指摘できますか?

編集: www.stray-bits.com は、私がそれへの参照を保持しているかどうかを尋ねました。あなたの言いたいこと、または私がそれを正しくやったかどうか。

EDIT2: マイク・マクマスターとアンディ -- あなたたちの言うことはおそらく正しいでしょう。私はここにコードを持っていません (同僚のマシン上にあり、彼らはその日のうちに出発しました)、配列に値を入力するために、decoder(?) オブジェクトを使用する行に沿って何かを行っていました。

この関数の目的は、iPhone からファイルを開き、そのファイルを配列に読み込むことです (これは、プログラムの前回の実行で保存したオブジェクトの配列です)。その「デコーダー」には、データを配列に入れるメソッドがあります。

男、私はこれを完全に解体しました。皆さんがフォローできることを本当に願っています。アドバイスをありがとう。詳しく見ていきます。

4

5 に答える 5

2

この場合、retain を呼び出す必要はありません。[[NSMutableArray alloc] init] は保持カウント 1 でオブジェクトを作成するため、明示的に解放するまで解放されません。

もっとコードを見ると良いでしょう。これまでに投稿したごくわずかな量のエラーではないと思います..

于 2008-09-24T21:40:10.600 に答える
2

私はマイクに同意します - あなたが投稿したコードに基づいて、それは正しいようです. 関数を呼び出して配列にアイテムを追加するために使用されるコードを投稿することに加えて、関数の最後 (すべてのオブジェクトがある場合) でポインターのメモリアドレスをチェックしてみてください。 (オブジェクトがない場合)。なぜ違うのかはわかりませんが、アイテムも配列に固執するはずです。

于 2008-09-24T21:54:17.540 に答える
2

実際に役立つようにするには、配列にオブジェクトを追加する方法をもう少し示す必要があります。

多くの人が次のようなコードを書いているのを見てきました。

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];

array = [foo bar];

これを行う人々は、可変配列を「作成してから設定する」と考えていますが、それはまったくそうではありません。代わりに、可変配列を作成し、それを という名前の変数に割り当ててから、別の可変配列をその変数にarray割り当てます。

そのため、変数を参照先のオブジェクトと混同しないように注意してください。オブジェクトは変数ではなく、変数を介して相互作用します。

于 2008-09-24T22:23:57.750 に答える
1

投稿したコードは機能するはずです。デコーダー関数で何か面白いことをしているに違いありません。

その配列を保持しないでください。initで自動的に保持されます。それを保持すると、メモリがリークします。Objective cから始めたばかりの場合は、時間をかけて「Cocoaのメモリ管理プログラミングガイドの概要」をお読みください。それはあなたに多くの頭痛を免れるでしょう。

なぜファイルから配列を読み取るために多くのコードを書いているのですか?フレームワークによってすでにサポートされています:

+ arrayWithContentsOfFile:

指定されたファイルの内容から初期化された配列を返します。指定されたファイルは、フルパス名または相対パス名にすることができます。名前を付けるファイルには、writeToFile:atomically:メソッドによって生成されるような配列の文字列表現が含まれている必要があります。

だからあなたはこれを行うことができます:

NSMuatableArray *myArray = [NSMutableArray arrayWithContentsOfFile:@"path/to/my/file"];

これは便利なメソッドなので、オブジェクトは自動解放されます。保管したい場合は、必ずこれを保管してください。

于 2008-09-29T05:59:44.723 に答える
1

NSMutableArray は追加されたオブジェクトを保持しますが、配列自体は保持していますか?

于 2008-09-24T20:53:38.013 に答える