2

文字列を含む配列があるとしましょう。

NSArray *names = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil];

私が望むのは、いくつかのカスタム クラスのオブジェクトを開始し、それらを可変配列に追加することです。文字列引数を取るカスタム init メソッドを使用しています。

より具体的には[SomeClass alloc] initWithName: aName]、結果のオブジェクトをに追加したいと思いますNSMutableArray

Objective-C の高速列挙を使用することを考えています。だから私が得るものは次のとおりです:

NSMutableArray *objects = [NSMutableArray arrayWithCapacity: [names count];

for (NSString *name in names) {
    [objects addObject: [[[SomeClass alloc] initWithName: name] autorelease]];
}

問題はnil、配列に追加できないことと、例外処理が好きではないことです。ただし、私の開始メソッドは を返す場合がありnilます。そこで、追加する前に最初にチェックすることにしました(防止)。私の新しい for-in ループは次のとおりです。

SomeClass *someObject;

for (NSString *name in names) {
    someObject = [[[SomeClass alloc] initWithName: name] autorelease];
    if (someObject) {
        [objects addObject: someObject];
    }
}

ここで、新しいオブジェクトをすぐに配列に渡すのではなく、someObject最初にポインターを設定してから、ポインターを配列に渡します。

この例は私に疑問を投げかけます。ループ内でsomeObject = [[[SomeClass alloc] initWithName: name] autorelease]、配列内の既存のオブジェクト (同じポインターを使用して追加されたもの) も変更されますか?

言い換えれば、addObject: (id)someObjectメソッドは渡したポインターの新しい内部コピーを作成するのか、それともポインターのコピーを作成する必要があるのか​​ (方法はわかりません)、そのコピーを自分で渡す必要があるのでしょうか?

どうもありがとう!:-)

4

4 に答える 4

3

再利用しても問題someObjectありません。考えてみればname、ループを通過するたびにすでに再利用しています。

-addObject:渡されたオブジェクトをコピーする場合とコピーしない場合があります (そうではありません。オブジェクトをコピーするのではなく保持しますが、代わりに NSMutableArray サブクラスがコピーできる可能性があります。) 重要なことは、このコードが実際にコピーする必要があることです。何をするかは気にし-addObject:ません。

また、ポインターとそれが指しているオブジェクトとの違いを見失わないでください。ポインターは単なる参照であり、ポインターはメソッドまたは関数に渡すたびにコピーされます。(C と同様に、Objective-C はパラメーターを値で渡すため、ポインターをメソッドに渡すと、ポインターの値がスタックに置かれます。)ただし、オブジェクト自体はコピーされません。

于 2011-05-12T14:41:53.203 に答える
2

簡単な答え: いいえ、再利用について心配する必要はありませんsomeObject

少し長い答え: 代入 — <code>someObject = ... は新しいポインター値をsomeObject変数に代入します。addObject:その後、それ自体のアドレスではなく、その値を取得していますsomeObject

于 2011-05-12T14:36:24.203 に答える
2

ここでポインターの概念に混乱していると思います。someObject = [[[SomeClass alloc] init...基本的someObjectに新しいオブジェクトへのポインターを指していると言います。あなたの質問に答えるために、あなたの現在のコードは問題ありません。

配列がそれらに追加されたオブジェクトのコピーを保持するかどうかについては、配列は追加したオブジェクトを保持します。ただし、それは上記のコードには関係ありません。

于 2011-05-12T14:39:01.837 に答える
0

Three20が答えを提供します!

于 2011-06-21T12:41:23.343 に答える