3

Alloc、new、または copy を使用する場合、オブジェクトを所有していて、オブジェクトを解放する必要があることを理解しています。オブジェクトを保持している場合、それを解放する必要があることを理解しています。

しかし、メソッドの最後に次のステートメントがあるとします。

return [[UIImage alloc] initWithContentsOfFile:path];

メモリ空間を割り当てたのでオブジェクトを所有していUIImageますが、呼び出し元に返されたため、オブジェクトへの参照がありません。私のdealloc()方法では、参照がないため、リリースできません。

だから私の質問は、これは正しいですか:

return [[[UIImage alloc] initWithContentsOfFile:path] autorelease];

この場合、呼び出し元が所有権を取得したい場合は、返されたオブジェクトを保持でき、最終的には自分自身を解放する必要があると思います。

ご協力いただきありがとうございます。

4

5 に答える 5

5

あなたの仮定は正しいです。オブジェクトを返すときは、autorelease オブジェクトとして渡す必要があります。

遅延解放メッセージを送信する必要がある場合、通常はメソッドからオブジェクトを返す場合に autorelease を使用します...

于 2012-08-20T14:13:40.493 に答える
4

自動解放の要点は、オブジェクトを返すことを中心に構築されました。

- (id)bad {
    MyObj *obj = [[MyObj alloc] init];
    return obj;
}

このコードはすべてを正しく返しますが、(開発者として) 後でオブジェクトを解放する必要があります。

- (id)moreBad {
    MyObj *obj = [[MyObj alloc] init];
    return [obj release];
}

このコードはメモリを予想どおりに使用し、1 つのスコープで保持と解放のバランスを取りますが、返されるオブジェクトはガベージです (これはクラッシュすることが予想されます)。

- (id)good {
    MyObj *obj = [[MyObj alloc] init];
    return [obj autorelease];
}

このコードは「遅延リリース」です。retainつまり、呼び出し側でオブジェクトを使用でき、オブジェクトは安全です。範囲内にない場合は確実に壊れる可能性がありますがNSAutoreleasePool、それは非常にまれな状態であり、いつ発生するかはほとんどわかっています (最も一般的なシナリオは、「デフォルト」の自動解放プールがない場所で新しいスレッドを開始することです)。

したがって、一般的な方法は、retain (およびretain-like) と release メソッドのバランスを1 つの scopeでとることです。次の提案は、常にオブジェクトを alloc-init-autorelease にして、メモリの問題がある場合は別のリリースに切り替えることです (ループ内の多数のオブジェクトの自動解放など)。次の提案は、ARC に切り替えることです。

于 2012-08-20T14:19:49.937 に答える
0

ただし、releaseを使用すると、文字列は返される前に割り当てが解除されます(そして、メソッドは無効なオブジェクトを返します)。自動解放を使用すると、所有権を放棄することを意味しますが、メソッドの呼び出し元は、割り当てが解除される前に、返された文字列を使用できます。

于 2012-08-20T14:34:02.760 に答える
0

なぜそれを割り当てようとするのですか?言うだけ:

return [UIImage imageWithContentsOfFile:path];

割り当てるものはありません - 解放するものはありません。

また、解放しようとするとエラーが発生する ARC を使用している場合、これが最適なオプションです。

于 2012-08-20T14:13:43.707 に答える
0

どちらの答えも正しいですが、便利な方法をいつでも自由に使えるとは限りません。

- (MySomethingClass*)giveMeAFancyObject{
    MySomethingClass *obj = [[[MySomethingClass alloc] init] autorelease];
    obj.name = @"Something";
    // do some setting up maybe
    return obj;
}
于 2012-08-20T14:19:59.047 に答える