私はネットワークに接続することによっていくつかの仕事をする目的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];
}
正常に動作します。手がかりを探しているうちに、メソッド呼び出しをスケジュールするために使用できるメソッド 'performSelectorOnMainThread'を見つけました。問題を解決することはできますか? – Hemant
これは、あなたの問題を解決することもできます。なぜなら、 'performSelector ...'機構はあなたのオブジェクトを保持し、メソッドを呼び出してから解放するからです。 'performSelector'メソッドを終了するまで待つようにした場合、その呼び出し中に割り当てが解除されるので、今度は同じ問題が発生します。終了するまで待たなければ、メモリに問題はないはずですが、完了後は何もできません。それが受け入れられるなら、あなたは大丈夫でしょう。 –
私はあなたのコメントに基づいて答えを更新する自由を取った。それは答えを完成させ、私はそれを喜んで受け入れることができます。あなたが気にしないことを願っています。 – Hemant