2011-01-16 24 views
3

私はネットワークに接続することによっていくつかの仕事をする目的Cで書かれたクラスを持っています。このクラスは非同期で動作し、ユーザーは操作が完了すると呼び出されるデリゲートを提供します(失敗の場合は成功またはエラーが返されます)。デリゲートは、それ以上の作業がなくオブジェクトが解放されたときに呼び出されます。コールバックでオブジェクトをリリースする方法を教えてください。

今、私はそのデリゲートの呼び出しでクラスのオブジェクトを解放するときにユースケースをサポートしたいと思います。私のクラスのインスタンスは再利用できないので、これは自然なことです。現在のところ、コールバックからコールバックが返されたときには、リリースされたことを確認するためだけに残した場所から続行しようとします。言うまでもなく、その時点でアプリケーションがクラッシュします。

NSURLConnectionクラスがそういったことをすることができます。コールバック- (void)connectionDidFinishLoading:(NSURLConnection *)connectionで接続オブジェクトを解放しても問題ありません。どうすれば同じことができますか?

EDIT:

ここではそれをよりよく理解するためのコードです:

@class MyRequest; 

@protocol MyDelegate 

- (void)completedRequest:(MyRequest*)request; 

@end 

@interface MyRequest : NSObject { 
    id<MyDelegate> myDelegate; 
    //variables... 
} 

- (id)init; 
- (id)initWithUrl:(NSString*)url delegate:(id<MyDelegate>)delegate; 
- (void)dealloc; 

- (void)fire; 

@property (nonatomic, readonly) bool fired; 
@property (nonatomic, readonly) NSInteger resultCode; 
@property (nonatomic, readonly) NSString *errorMessage; 

@end 

ユーザーはMyRequestのオブジェクトを作成し、fireメッセージを送信します。 MyRequestは内部でNSURLConnectionを使用して作業を行います。応答が受信されると、私は指定された代理人を呼び出します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    NSLog(@"In connectionDidFinishLoading..."); 

    resultCode = RESULT_SUCCESS; 
    [urlConnection release]; 
    [urlRequest release]; 

    if (myDelegate != nil) 
     [myDelegate completedRequest:self]; 
} 

答えて

4

デリゲートコールバックを呼び出してオブジェクトの有効期間を延長する前に、[[self retain] autorelease]を追加するだけです。これにより、後で解放され、仕上げることができます。

もう1つの方法はperformSelectorOnMainThreadメソッドNSObjectを使用することです。 performSelector...機械はオブジェクトを保持し、メソッドを呼び出してから解放します。 performSelectorメソッドを終了するまで待機させると、その呼び出し中に割り当てが解除されるので、今度は同じ問題が発生します。終了するまで待たなければ、メモリに問題はないはずですが、完了後は何もできません。それが受け入れられるなら、あなたは大丈夫でしょう。

+0

正常に動作します。手がかりを探しているうちに、メソッド呼び出しをスケジュールするために使用できるメソッド 'performSelectorOnMainThread'を見つけました。問題を解決することはできますか? – Hemant

+0

これは、あなたの問題を解決することもできます。なぜなら、 'performSelector ...'機構はあなたのオブジェクトを保持し、メソッドを呼び出してから解放するからです。 'performSelector'メソッドを終了するまで待つようにした場合、その呼び出し中に割り当てが解除されるので、今度は同じ問題が発生します。終了するまで待たなければ、メモリに問題はないはずですが、完了後は何もできません。それが受け入れられるなら、あなたは大丈夫でしょう。 –

+0

私はあなたのコメントに基づいて答えを更新する自由を取った。それは答えを完成させ、私はそれを喜んで受け入れることができます。あなたが気にしないことを願っています。 – Hemant

関連する問題