11

リリースと自動リリースについては、まだ不明な点があります。それらの両方の違いは何ですか?私はこのコードを持っています。Facebook接続用。Facebookのログインに行くと時々クラッシュしますが、オブジェクトをうまくリリースしていないことが原因かもしれません。助けてくれてありがとう

if (_session.isConnected) {
        [_session logout];
    } else {
        FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
        [dialog show];
    }
4

4 に答える 4

22

Cocoaのメモリ管理プログラミングガイドはまもなくあなたの親友になります。簡単に言うと、Cocoaのオブジェクトインスタンスは、参照カウントを使用してメモリ管理されます(もちろん、OS Xでガベージコレクションを使用している場合を除く)。オブジェクトは、メッセージを送信することにより、他のインスタンスの所有権を「保持」すること、つまり割り当てが解除されないようにすることを示し-retainます。-releaseオブジェクトは、他のインスタンスにメッセージを送信することにより、その関心を解放したいことを示します。'保持されている'オブジェクトの数とオブジェクトの所有権が0に低下した場合(つまり、所有しているインスタンスの最後が-releaseメッセージを送信した場合)、保持カウントが0のインスタンスの割り当てが解除されます。

「このインスタンスは将来リリースされるようにしたい」と言うと便利な場合があります。それがの目的です-autorelease。メッセージを送信する-autoreleaseと、受信者が現在のに追加されますNSAutoreleasePool。そのプールが空になると-release、プール内のすべてのインスタンスにメッセージが送信されます。AnNSAutoreleasePoolは、各スレッドの実行ループの各反復の開始時に自動的に作成され、その反復の終了時に排出されます。したがって、メソッドで次のようなことを行うことができます。

- (id)myMethod {
  return [[[MyObject alloc] init] autorelease];
}

このメソッドの呼び出し元は、-retain保持したい場合に可能なインスタンスを返します。彼らがそれを保持しない場合、それは少なくとも囲んでいる自動解放プールが排出されるまで残ります:

- (void)someOtherMethod {
...

id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns

}
于 2010-01-16T06:34:15.067 に答える
11

リリースとは、すぐにリリースすることを意味します。自動解放とは、変数を次の自動解放プールで解放することを意味します。

変数を保持し続けたいが、メモリリークを作成したくない場合は、自動解放を使用します。変数が不要になったときにreleaseを使用します。

サンプル:

- (NSNumber *)return5 {
    NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
    [result autorelease];
    return result;
}

そこで自動リリースを使用するのはなぜですか?

代わりに[結果リリース]を使用すると、その時点で可変結果が破棄されます。つまり、戻り値はガベージになります。

まったく解放しないと、変数resultは永久に保持され、メモリリークが発生します。

関数のすべての呼び出し元に結果をリリースするように指示できますが、それは頭痛の種であり、エラーが発生しやすくなります。

したがって、自動リリースを使用します。次の自動解放プールで解放される変数をマークします。基本的に、変数を割り当ての近くでリリースするようにマークします。したがって、マントラ割り当ては、同じ機能のリリースとペアになっており、常に保持されます。

実際には、すべてのリリースを自動リリースに変更することで問題ありません。メモリの使用は効率的ではありませんが、影響は最小限です。すべてのプログラミング言語のすべての変数は、効果的に自動解放されます。

とにかく、ARCを使用してください。

于 2012-09-21T03:47:54.190 に答える
4

背景の議論:

Objective-cは参照カウントであるため、参照カウントが0に達するとオブジェクトが削除されます。releaseは参照カウントをすぐに減らし、autoreleaseはautorelease-poolがポップされるとそれを減らします。

いつ使用するか:

次の場合、オブジェクトを割り当てるときに自動解放を使用します

  • 現在の機能の後には必要ありません
  • それは他のオブジェクト/関数によって再利用され、後で保持コードによって解放されます
  • 現在の関数のロジックがトリッキーな場合は、リターンを実行する前に、リリースを12か所の異なる場所に送信する必要があります。

「手動」リリースを使用する

  • 以前の保持を元に戻す(ライブラリを実装している場合)
  • オブジェクトの解放を正確に制御する必要がある場合(たとえば、オブジェクトが大量のメモリを使用している場合、または自動解放プールがしばらくの間ポップされない場合)

しかし、本当に私の友人:

エリック

于 2010-01-16T07:01:06.750 に答える
3

Cocoaのメモリ管理プログラミングガイドによると:

NSObjectによって定義されたautoreleaseメソッドは、後でリリースするためにレシーバーをマークします。オブジェクトを自動解放することにより、つまり、自動解放メッセージを送信することにより、自動解放を送信した範囲を超えてオブジェクトを所有したくないことを宣言します。

また:

したがって、autoreleaseメソッドを使用すると、すべてのオブジェクトが他のオブジェクトを破棄することを心配せずに使用できます。

于 2010-01-16T06:24:38.633 に答える