ブロック内でデリゲートを使用する際に問題が発生しました。
ARCがオンの場合、これは問題を示す例です。
- (void)whatsGoingOn {
NSString *address = @"someAddress";
//setting for request
NSURL *requestURL = [NSURL URLWithString:address];
__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:requestURL];
[delegate_ postDelegateMethod]; //This delegation works fine
[request setCompletionBlock:^{
[delegate_ postDelegateMethod]; //This delegation doesn't work
}];
[request startAsynchronous];
}
ブロック内に委任を投稿できないようです。この状況で私は何をすべきですか?
代わりに通知を使用することもできますが、それが良い方法だとは思いません。
これはクラスの頭の部分です。ウィークを使用しない場合、リクエスト部分は保持サイクルを作成するため、まだ何をすべきかわかりません。
@interface URLFilter : NSObject {
id __weak delegate_;
}
@property (nonatomic, weak) id delegate;
@implementation URLFilter
@synthesize delegate = delegate_;
*解決しました!!!
別の__blockidblockDelegateを作成することで機能しました。また、メモリリークもありません。
- (void)whatsGoingOn {
NSString *address = @"someAddress";
//setting for request
NSURL *requestURL = [NSURL URLWithString:bitlyAPIAddress];
__weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:requestURL];
//set blockDelegate since delegate_ will be gone inside blocks
__block id blockDelegate = delegate_;
[request setCompletionBlock:^{
//it works
[blockDelegate postDelegateMethod];
}];
[request startAsynchronous];
}
アップデート
コードをもう一度確認しましたが、この問題は、whatsGoingOnメソッド以外のこのブロックメソッドが原因である可能性があります。
このTwitterAPIブロックメソッド内にwhatsGoingOnメソッドを呼び出し、whatsGoingOnメソッド内にasihttprequestブロックメソッドを配置します。
不思議なことに、ブロックの横でasihtttprequestの通常のデリゲートメソッドを使用すると、クラッシュするため、asihttprequestのブロックメソッドを選択しました。
//request tweet data
[twRequest performRequestWithHandler:^(NSData *responseData,
NSHTTPURLResponse *urlResponse,
NSError *error) {
[self whatsGoingOn];
}];