我在 Blocks 中使用委托时遇到问题。
在 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];
}
看来我不能在 Blocks 中发布委托。在这种情况下我该怎么办?
我可以改用通知,但我觉得这不是一个好方法。
这是班级的主要部分。如果我不使用weak,请求部分会产生一个retain循环,所以还不知道该怎么做。
@interface URLFilter : NSObject {
id __weak delegate_;
}
@property (nonatomic, weak) id delegate;
@implementation URLFilter
@synthesize delegate = delegate_;
*已解决!!!
它通过制作另一个 __block id blockDelegate 来工作。而且,也没有内存泄漏。
- (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 方法之外的这个块方法引起的。
在这个 twitter api 块方法内部,我称之为 whatsGoingOn 方法,在 whatsGoingOn 方法内部,我放置了 asihttprequest 块方法。
奇怪的是,如果我在块的一侧使用通常的 asihtttprequest 委托方法,它就会崩溃,这就是我选择 asihttprequest 的块方法的原因。
//request tweet data
[twRequest performRequestWithHandler:^(NSData *responseData,
NSHTTPURLResponse *urlResponse,
NSError *error) {
[self whatsGoingOn];
}];