1

私は見てきましたが、この質問に対する決定的な答えを見つけることができませんでした。Objective-c非同期メモリ管理

私は非同期操作を実行するクラスを持っている場合、いつどのように解放するのですか?

-(void)main 
{ 
    AsyncObject *async = [[AsyncObject alloc] initWithDelegate:self]; 

    [async goDoSomething]; 
} 

-(void)didSomething:(Result*)result 
{ 

} 

いつ* asyncをリリースしますか?

答えて

0

おかげで、 NSURLConnectionを使ってどのように処理したかを調べる(あなたがそれを自動解放すると、非同期操作で続行されます)。

すべての非同期ステップの始めに、内部的に保持カウントがバンプされ、すべての非同期ステップの終わりに内部的に解放されます。

これは、autorelease/releaseを送信できることを意味し、現在の操作が完了するまで実際には解放されません。

// MAIN.M 

-(void)main 
{ 
    AsyncObject *async = [[[AsyncObject alloc] initWithDelegate:self] autorelease]; 

    [async goDoSomething]; 
} 

-(void)didSomething:(Result*)result 
{ 

} 

// ASYNCOBJECT.M 

-(void) goDoSomething 
{ 
    [self retain]; 
} 

-(void) finishedDoingSomething 
{ 
    [delegate didSomething:result]; 
    [self release] 
} 
+0

注意してください。この場合、あなたは(1)それを割り当ててから、(2)それを保持しているので、非同期でリークしています。あなたは一度だけそれをリリースしています。 – csano

+0

さて、いいえ、呼び出し元は、それ自身のメカニズムで解放するか、autoreleaseを呼び出す責任があります。内部的には、各非同期操作の開始時と終了時に保持を破棄しています。純粋に、非同期操作が途中で失敗してアプリケーションを実行しないようにするためです。また、発信者がそれを解放するための便利な方法も提供します(autoreleaseには今のところ効果があります)。編集:申し訳ありません私は私のサンプルでオートリリースを見逃しています。それを追加しました。 – Tyler

2

プライベートプロパティを保持して値を保存するか、AsyncObjectを制御できる場合は、didSomething:セレクタのインスタンスを渡します。 デリゲートコールを取得するまでオブジェクトが保持されることを知っているので、最初のオプションが優れていると思います。

オプション1:

ClassName.m

@interface ClassName() 
    @property (nonatomic, retain) AsyncObject* async; 
@end 

@interface 
//... 

-(void)main 
{ 
async = [[AsyncObject alloc] initWithDelegate:self]; 

[async goDoSomething]; 
} 

-(void)didSomething:(Result*)result 
{ 
    [async release]; 
    async = nil; 
} 

オプション2:

-(void)aysncObject:(AsyncObject*)async didSomething:(Result*)result { 
    [async release]; 
} 
1

あなたのオブジェクトは、バックグラウンドスレッドでの非同期タスクを実行し、またはタイマーのターゲットである場合、またはGCDを使用し、ディスパッチされたブロック(^ {} kerjigger)の範囲内で参照されると、そのバックグラウンド操作の存続期間中はあなたのために保持されます。

ので、通常の使用の場合は、次のようになります。

AsyncObject *async = [[AsyncObject alloc] initWithDelegate:self]; 
[async goDoSomething]; 
[async release]; 

、それはないを持つオブジェクトへの__blockスコープの参照を使用することにより、例えば(保持されているオブジェクトとバックグラウンドで動作することが可能ですGCDを使用するか、ワーカースレッドをNSThread/NSOperationの代わりにpthreadsで切り離してください)。しかし、一般的な使用例はありません。そのような場合は、-goDoSomethingが内部で保持し、操作の間、selfをリリースするようにする必要があります。私は少しをした

(誰かがオブジェクトがあなたのために保持されていない場合を考えることができれば、コメントで投稿し、私は私の答えを更新しますしてください。)ヘルプみんなのため