私は常に、2 番目の方法が優れていると本の中で述べてきました。しかし、過去に何人かの人々は同意しませんでした。iOS で。違いは何ですか?
- 違いはありますか?
どちらのバリアントもオブジェクトを割り当てます。両方のバリアントがリリースを処理します。(「オートリリースはリリースです。」)しかし、彼らは異なる時点でそれを行います:
- バリアント: オブジェクトは ARP の最後、少なくともランループの最後に解放されます。
- バリエーション 2: オブジェクトは ですぐに解放され
release
ます。
(両方:追加の参照がない場合。)
- なぜ -autorelease が必要なのですか?
release
MM ルールに違反しない限り、a が不可能な状況があります。最も簡単なケースは、割り当てられたオブジェクトを返したい場合です。誰がリリースすべきですか?作成方法は?これにより、割り当てが解除された可能性のあるものが返されます。メッセージを送信したメソッドは? alloc
これは、 +1 メソッドのような-1 メソッドのバランスを崩しrelease
ます。追いつめられて。
例:
- (NSString*)fullName
{
NSString *fullName = [[NSString alloc] initWithFormat:@"%@, %@", self.lastName, self.firstName];
return fullName; // Who balance +alloc?
}
オブジェクトを自動解放することで、メソッドのバランスが保たれ、オブジェクトを安全に返すことができます。
それ以外の場合は、依存関係を取り除く便利な方法です。次のコードを想像してください。
Person *person = …;
NSString *name = person.name;
[person release], person=nil; // Imagine that this will dealloc the instance.
// name is invalid, because person released it.
あなたautorelease
とその問題はありません。いくつかの解決策があります。
getterはretain
、autorelease
戻り値に , を送信します。ARP には、文字列の割り当て解除を防止する追加の参照があります。
- (NSString*)name
{ return [[_name retain] autorelease]; }
または、メソッドを使用する人がそれを行います:
NSString *name = [[person.name retain] autorelease];
問題の次の問題release
は、return
、break
またはcontinue
:
while (…)
{
id object = [[Class alloc] …]
if (…)
{
break;
}
[object release];
}
オートリリースで問題ありません。
次へ: いくつかの理由から、便利なアロケーターを使用することをお勧めします (存在する場合)。そこから返されたオブジェクトを明示的に解放することは許可されていないため、参照を放棄するためのコードは、参照がどのように設定されたかに依存します。常に自動リリースを使用しないのはなぜですか?
- 自動解放の欠点は何ですか
オブジェクトの削除は延期される可能性があるため、メモリ フットプリントで問題が発生する可能性があります。しかし、個人的に@autorelease{}
は、release
.