1

これはおそらくオブジェクトの割り当て/保持/解放に関する質問ですが、例としてNSStringを使用します。私は私ができることを知っています:

NSString* myString = [[NSString alloc] initWithString:@"Test"];

基本的に、変数myStringによって参照される文字列を割り当てて初期化します。この文字列は、後で[myStringrelease]を呼び出す必要があります。ただし、これを行った後、次のような他の文字列に設定します。

myString = someOtherString;

ポインタを別のオブジェクトに再割り当てし、割り当てた元のオブジェクトへのすべての参照を失ったため、基本的にメモリリークが発生しますか?

文字列を個人的に割り当てて解放し、その値をさまざまな時点で変更したい場合は、「=」以外の別の構文を使用する必要がありますか、それとも元々myStringで表されていたオブジェクトの内容を適切に変更するためにオーバーロードされていますか? =を使用する場合。

4

3 に答える 3

4

はい、あなたの例では、メモリをリークしています。

NSString* myString = [[NSString alloc] initWithString:@"Test"];
myString = someOtherString;

あなたはこれを次のように行う必要があります:

NSString* myString = [[NSString alloc] initWithString:@"Test"];
[myString release];
myString = someOtherString;

説明されている保持/解放の全体を聞いた最良の方法は、誰かのために犬を散歩させていると想像することです。あなたの「オブジェクト」は犬であり、「保持」は犬にひもを付け、「解放」はひもを外します。犬には好きなだけひもを付けることができますが、犬が自由に走らないように(漏れ)、犬に少なくとも1つのひもを付けておきたいと考えています。また、犬を取り戻したら、すべてのひもを犬から外したいと考えています。所有者に(オブジェクトを削除したい)。あなたの例では、散歩の途中で犬のひもを手放し、別の犬のひもを拾うと考えることができます。

于 2010-07-22T19:54:04.193 に答える
1

別のポインタ値を割り当てる前に所有権を適切に放棄した場合、リークは発生しません。

NSString *a = [[NSString alloc] init];
// ... 
[a release]; // relinquish ownership
a = someOtherString; // fine, we don't own the previous instance anymore

を呼び出してオブジェクトの所有権を放棄した瞬間に、オブジェクトのrelease割り当てが効果的に解除されたと見なす必要があります。これが、オブジェクトへの最後の参照であった可能性があります。ポインタがまだ同じ値を持っているということは、Objective-Cクラスタイプがどのように実装され使用されるかという副作用にすぎません。

autoreleaseメモリの制約とコードの機能に応じて、 dインスタンスを使用することもできます。

NSString *a = [NSString stringWithString:@"moo"];
a = someOtherString; // fine, a will be released later by the nearest autorelease pool

参照がローカル変数ではなくivarである場合は、代わりに宣言されたプロパティを使用することをお勧めします。

于 2010-07-22T19:44:34.987 に答える
0

次のことができます。

NSString *myString = [NSString stringWithString:@"Test"];

返された文字列は自動解放されるため、解放する必要はありません。また、それを「所有」していません。それが問題である場合は、他の人が提案したように行い、その値を再割り当てする前ににreleaseメッセージを送信してください。myString

于 2010-07-22T20:11:31.593 に答える