我有一个 AuthService 类,该类具有执行异步连接登录的方法。该类实现了 NSURLConnectionDataDelegate 协议,因此当服务器响应时,它会调用视图控制器先前设置的完成处理程序来更新 UI。
这是该完成处理程序的定义
@property void (^completionHandler)(LoginResult *result);
这是该类接收服务器响应的时间
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSString *response = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
//Do something with the response and create an instance of LoginResult class
self.completionHandler(loginResult);
}
如果完成处理程序块只是调用 NSLog 将作为参数传递的登录结果信息写入控制台,那么它可以完美运行而没有错误。但是当我想调用拥有该块的 ViewController 的方法时,就会发生一些奇怪的事情。
我知道当您在拥有该块的块中包含一个对象时存在一个保留周期。所以这就是我编码的方式。
__block typeof(self) bself = self;
[authService login:blablabla completionHandler:^(LoginResult *result) {
[bself didReceiveLoginResult:result];
}
我认为这将防止进入保留周期。但是调试时出现“线程:EXC_BAD_ACESS”错误。
PS 例如,即使该属性未声明为“复制”,以下代码也可以完美运行
[authService login:blablabla completionHandler:^(LoginResult *result) {
NSLog(@"Login %@", result.success ? @"success" : @"failed");
}