strongSelf指向弱自己一块,为什么?

时间:2015-01-20 15:14:53

标签: ios objective-c uiviewcontroller objective-c-blocks

我想了解这段代码:

__weak LoginViewController *weakSelf = self;

NSTimer *networkTimer = [NSTimer pym_scheduledTimerWithTimeInterval:15.0 block:^{
    LoginViewController *strongSelf = weakSelf;
    [strongSelf timeout];
} repeats:NO];

[PYMAuthManager loginWithUsername:username password:password completionHandler:^(BOOL successful) {
    if (successful) {
        [networkTimer invalidate].......

是网络计时器,如果没有活动,将在15秒后超时。为什么在块中创建指针* strongSelf = weakSelf?使用[weakSelf timeout]不行吗?我明白无论何时在块中访问self我们都必须使用弱引用,为什么在这里创建另一个指针?任何帮助都会很棒,谢谢。

1 个答案:

答案 0 :(得分:5)

编辑:更新以更好地反映实际的系统语义(正如Darren所指出的那样)。

通过在块中使用weakSelf,您可以避免保留周期。如果您要用[weakSelf timeout]替换块代码,则没有区别;该对象在timeout执行期间保留。

如果您使用__unsafe_unretained来创建weakSelf,则机器可能会将内存释放回系统并导致您的应用EXC_BAD_ACCESS执行timeout。在此实例中创建强引用可以避免此错误。


当您创建强引用时,它将保持在其范围内;在这种情况下,在块的持续时间内。因为您的块只能有效地执行一个语句,所以替换[weakSelf timeout]不会造成任何伤害。如果您有多个语句全部使用weakSelf或依赖于weakSelf的状态,那么您可能希望为所有语句的范围创建强引用。

相关问题