0

次のコードが示すように、新しい文字列オブジェクトのインスタンス化を行う必要がありますか?

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

または、次のコードを実行するだけで済みます。

NSString *newText = sender.titleLabel.text;

同じ結果が返されると思います。では、「alloc」と「init」が必要かどうか、必要でない場合はいつわかりますか?

ありがとう

ジェン

4

2 に答える 2

4

割り当て()を使用するだけですnewText = sender.titleLabel.text;

2つの例の結果は同じではありません。ところで、最初の例では新しいオブジェクトを作成し、2番目の例では既存のオブジェクトを再利用します。最初の例では、後で呼び出し[newText release];(または自動解放)する必要がありますが、2番目の例ではそうではない場合があります。

文字列をインスタンス変数に格納する場合は、それをコピーする必要があります(myInstanceVariable = [sender.titleLabel.text copy];)。その理由は、NSMutableStringのインスタンスである可能性があり、変更されて予期しない動作が発生する可能性があるためです。

于 2011-04-04T12:20:46.030 に答える
2

使用する場合:

NSString *newText = sender.titleLabel.text;

sender.titleLabel.textにある既存のオブジェクトへのポインタを設定しているだけです。この新しいポインターがNSString型のオブジェクトを指していることをコンパイラーに伝えています。

注: ポインターnewTextとsender.titleLabel.txtは両方とも同じオブジェクトを指すようになったため、いずれかのポインターを使用してオブジェクトにアクセスすると、基になるオブジェクトに加えられた変更(テキストの変更など)が反映されます。

注2:使用した場合:

NSString *newText = [[NSString alloc] initWithFormat:@"%@",sender.titleLabel.text];

(allocを使用して)まったく新しいオブジェクトを作成し、alloc操作の実行時にsender.titleLabel.textの文字列値を使用してこの新しいオブジェクトを初期化しました。これで、 newTextsender.titleLabel.textは2つのまったく異なるNSStringオブジェクトになり、互いに関連性がなく、互いに完全に独立して変更/管理/使用/割り当て解除できます。

于 2011-04-04T12:43:33.497 に答える