参考块内的自我

现在我有这样的代码的一部分:

__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]; }]; 

我主要这样做,因为其他一些类从这个代码所在的类inheritance,并实现自己的requestFinished和requestFailed。

如果我将自引用更改为__weak,则会出现一些EXC_BAD_ACCESS错误。 有一个__strong引用一切工作正常,但我害怕创build一个保留周期。 请注意,我正在使用ARC。

这段代码是否会创build一个会导致问题的保留周期? 任何简单的解决scheme呢? 任何不同的方法,我可以遵循让inheritance类实现自己的方法来处理响应?

是的,它创build了一个保留周期。 它会导致问题吗? 也许。

如果API支持,则可以重置处理程序,这将手动中断保留周期:

 [operation setCompletionBlockWithSuccess:nil failure:nil]; 

或者你可以使用一个弱引用。 但是,你说你尝试了一个很弱的参考,它崩溃了。 一个弱引用保证在消息开始时为零,或者在消息被处理之前保持有效。 换句话说,考虑…

 __weak MyRequest *weakSelf = self; dispatch_async(someQ, ^{ [weakSelf doSomething]; }); 

如果weakSelf在asynchronous模块执行时为零,则“无”发生。 如果不是零,那么保证至less在doSomething完成之前保留。 实际上,它与此类似:

 __weak MyRequest *weakSelf = self; dispatch_async(someQ, ^{ { id obj = weakSelf; [weakSelf doSomething]; obj = nil; } }); 

但请注意,如果您这样做了:

 __weak MyRequest *weakSelf = self; dispatch_async(someQ, ^{ [weakSelf doSomething]; [weakSelf doSomethingElse]; }); 

doSomethingdoSomethingElse之间,这个对象可能会变成零。

而且,如果你通过一个弱引用访问一个实例variables,你只需要一个SEGV:

 __weak MyRequest *weakSelf = self; dispatch_async(someQ, ^{ foo = weakSelf->someIVar; // This can go BOOM! }); 

因此,如果你的处理程序正在访问单个消息的弱引用,那么你应该没问题。 还有什么要做的“弱强舞”。

 __weak MyRequest *weakSelf = self; dispatch_async(someQ, ^{ MyRequest *strongSelf = weakSelf; if (!strongSelf) return; [strongSelf doSomething]; [strongSelf doSomethingElse]; foo = strongSelf->someIVar; }); 

如果你认为你遵循的准则,那么可能是一个更完整的源代码示例,崩溃的细节将有助于…