0

私はObjectiveCに比較的慣れていないので、iPhoneアプリを書いている間、何かを理解するのに助けが必要だと思います。

文字列の動的リストをメインクラスのプロパティであるNSMutableArrayに格納しています。初期化では、100個のアイテムを格納するために割り当てて初期化します。

stringList = [[NSMutableArray alloc] initWithCapacity:100];

文字列が(受信データから)取得されると、それらをオブジェクトとして配列に追加します。

NSString *newString = [stringMaker makeStringFromData:data];
[stringList addObject:newString];

したがって、ここで実際に何が起こっているのかを理解するために。これを5回追加した場合、NSMutableArrayには実際に何がありますか?5つの文字列または実際の文字列へのポインタだけですか?addObjectが実際にデータをコピーしたと思っていました。stringMakerクラスが適切にリリースを開始した場合、何もポインタになってしまう可能性はありますか?私のリストの文字列が解放されたり、他の何かに再ポイントされたりしないようにするためのより良い方法はありますか?それとも、これがどのように機能するかを誤解していますか?

私は現在、この部分に問題はありません。しかし、私はリークと物事のリリースに少し不安を感じています。

これに私を導いたのは、文字列の1つを次のように変更すると問題が発生することです。

[stringList replaceObjectAtIndex: stringIndex withObject: stringMaker.lastStringUsed];

しばらくして、そのインデックスのオブジェクトにアクセスするために戻ってきたとき、それはlastStringUsedが最後だったものであり、置き換えたときのものではありません。これは、私が行ったのはポインターを設定しただけで、そのポインターにデータを保存しなかったことを示しています。lastStringUsedはstringMakerクラスのプロパティであり、NSMutableStringであることに注意してください。

明確にするために..stringMakerのさまざまな時点で私は次のことを行っています:

 [lastStringUsed setString: someString];

(ちなみに、それは実際にデータを移動しますか?)

次に、メインクラスに戻って、上記のreplaceObjectAtIndexを実行します。次に、他のstringMakerメソッドがlastStringUsedをリセットしています。その後、そのインデックスでstringListにアクセスすると、それは新しいlastStringUsed値であり、replaceObjectAtIndexを実行したときの値ではありません。

編集-今のところ解決済み-まだNSARRAYとストリングのナイトクラスを受講し、適切に保持およびリリースする必要があります

今のところそれを修正するために私がしたことは、新しい文字列を割り当てることでした...

NSString *replacementString = [[NSString alloc] initWithCapacity: 310];
[replacementString setString:stringMaker.lastStringUsed];
[stringList replaceObjectAtIndex:stringIndex withObject:replacementString];

次回lastStringUsedを変更しても、stringList内のものは変更されません。

4

1 に答える 1

0

オブジェクトを配列またはディクショナリに追加すると、そのオブジェクトはその配列またはディクショナリによって保持されます。addObjectを呼び出す前後に、配列に配置するオブジェクトの保持数を確認します。

于 2010-07-24T02:15:06.563 に答える