【发布时间】:2012-10-15 18:13:00
【问题描述】:
现在我有一段这样的代码:
__strong MyRequest *this = self;
MyHTTPRequestOperation *operation = [[MyHTTPRequestOperation alloc]initWithRequest:urlRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *request, id responseObject) {
[this requestFinished:request];
}
failure:^(AFHTTPRequestOperation *request, NSError *error) {
[this requestFailed:request withError:error];
}];
我这样做主要是因为其他一些类继承自这段代码所在的类,并实现了自己的 requestFinished 和 requestFailed。
如果我将自引用更改为 __weak,我开始收到一些 EXC_BAD_ACCESS 错误。使用 __strong 引用一切正常,但我担心创建保留周期。 请注意,我使用的是 ARC。
此代码是否会创建会导致问题的保留周期?有什么简单的解决方案吗?我可以遵循哪些不同的方法来让继承类实现自己的方法来处理响应?
【问题讨论】:
-
崩溃在哪里?完成/失败的方法包含什么?正如所写,确切的代码不会因 __weak 崩溃。
-
我不明白
this变量的必要性。为什么不使用该变量就不能直接调用[self requestFinished]?如果您有MyRequest类的子类并覆盖requestFinished,那么无论如何都会调用该子类的自定义requestFinished -
@jere:你不应该在一个块中强烈引用
self(参见this question)。 -
@Tim:这根本不是真的。只要
self没有对该块的强引用就可以了 -
newacct:非常好的观点,我之前的评论(在这方面)颇具误导性。 @jere:在块内强烈引用
self的危险是您可能会创建一个保留循环,以后不能将其作为垃圾收集;正如newacct 指出的那样,当self也对该块具有强引用时,就会发生这种情况。由于两者相互引用,因此它们都有效地防止了彼此被释放。 (我认为我链接的问题解释了这一点,但我之前的总结很不清楚 - 抱歉!)
标签: iphone objective-c ios objective-c-blocks