2

ばかげた質問かもしれませんが、私はまだメモリ管理について頭を悩ませているので、とにかく尋ねようと思いました。

これは :

1.

ViewController *tViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.viewController = tViewController;
[tViewController release];

これより良い :

2.

self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

方法と理由?

編集:

わかりました、まず、所有していたものを安全にリリースしました。私はそれが起こっているのを見ることができます。

しかし、2 番目のケースでは、それは延期されたリリースです。このautoreleaseようなものは私を混乱させます。

これは、プログラム内でそのようなことが起こる唯一の例ではありません。私が作成した特定のオブジェクトを神がいつ知るまで生き続けたい場合、どうすればよいですか? 私はautoreleaseそれ?しかし、それが間違ったタイミングで消えてしまったら? 私は何をしますか?

4

4 に答える 4

3

どちらも最終結果は同じですが、そこに到達する方法が異なります。どちらの場合も、後で解放される一時的な参照を作成しています。

最初のバージョンは、リリース時にすぐにインスタンスをリリースします (決定論的) - ただし、 self.viewController はおそらく強い参照であるため、リリース呼び出しでインスタンスの割り当てが解除されることはありません。

2 番目のバージョンは、現在の autorelease プールの割り当てが解除されたときに、将来のある時点 (非決定論的) にインスタンスを解放します。繰り返しますが、self.viewController がそれに対する参照を保持している場合、割り当ては解除されません。

于 2013-06-13T14:01:49.683 に答える
1

どちらも同じことを行います。唯一の違いは、1 にはインスタンスを設定するための参照 [tViewController] があり、2 では直接行われることです。

于 2013-06-13T13:46:08.440 に答える
0

私は常に、2 番目の方法が優れていると本の中で述べてきました。しかし、過去に何人かの人々は同意しませんでした。iOS で。違いは何ですか?

  1. 違いはありますか?

どちらのバリアントもオブジェクトを割り当てます。両方のバリアントがリリースを処理します。(「オートリリースはリリースです。」)しかし、彼らは異なる時点でそれを行います:

  1. バリアント: オブジェクトは ARP の最後、少なくともランループの最後に解放されます。
  2. バリエーション 2: オブジェクトは ですぐに解放されreleaseます。

(両方:追加の参照がない場合。)

  1. なぜ -autorelease が必要なのですか?

releaseMM ルールに違反しない限り、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はretainautorelease戻り値に , を送信します。ARP には、文字列の割り当て解除を防止する追加の参照があります。

- (NSString*)name
{ return [[_name retain] autorelease]; }

または、メソッドを使用する人がそれを行います:

NSString *name = [[person.name retain] autorelease];

問題の次の問題releaseは、returnbreakまたはcontinue:

while (…)
{
    id object = [[Class alloc] …]
    if (…)
    {
       break;
    }
    [object release];
}

オートリリースで問題ありません。

次へ: いくつかの理由から、便利なアロケーターを使用することをお勧めします (存在する場合)。そこから返されたオブジェクトを明示的に解放することは許可されていないため、参照を放棄するためのコードは、参照がどのように設定されたかに依存します。常に自動リリースを使用しないのはなぜですか?

  1. 自動解放の欠点は何ですか

オブジェクトの削除は延期される可能性があるため、メモリ フットプリントで問題が発生する可能性があります。しかし、個人的に@autorelease{}は、release.

于 2013-06-13T14:13:25.373 に答える
0

問題は、最初のケースでは、viewController を手動で解放することです。そしてすぐに破壊した。2 番目のケースでは、イベント サイクルの最後にオブジェクトが破棄されます。多くの自動解放されたオブジェクトを使用して、1 つの関数でサイクル内でメモリを消費する何かを実行する場合、自動解放プールを手動で作成し、反復ごとに排出します。

NSAutoreleasePool クラス リファレンスから:

Application Kit は、イベント ループの各サイクルの開始時にメイン スレッドに自動解放プールを作成し、最後にそれを排出することで、イベントの処理中に生成された自動解放されたオブジェクトを解放します。

于 2013-06-13T14:04:11.857 に答える