0

我在 WWDC 2011-Session 322 Objective-C Advancement in Depth 中看到了以下代码

-(void) startBlinker{
    __weak MyClass * weakSelf = self;

    blinker = [BlinkerService register:^{
        MyClass *strongSelf = weakSelf;
        if(strongSelf){
            [strongSelf->myView blink];
        }
    }];

}

我想我可以实现它,只需检查 weakSelf 之类的

if(weakSelf){
    [weakSelf->myView blink];
}

为什么代码使用strongSelf?

4

3 回答 3

3

如果弱引用指向的对象被释放,弱引用的计算结果为 nil。在 nil 上调用方法是可以的,但使用箭头运算符访问字段则不行。因此,在通过箭头指针访问字段之前,您必须确保指针不为零。

if(weakSelf){ // no weak sheeps this week
    // weakSelf may get deallocated at this point. 
    // In that case the next line will crash the app.
    [weakSelf->myView blink];
}

强 self 保证 self 不会在 if 和 if 块中的语句之间被释放。

于 2013-07-12T18:44:09.390 回答
1

通常这样做是为了避免在块中保留循环。如果您尝试访问对自身的强引用,则块保留自身会导致保留周期。因此,您在块外创建一个弱自我并在块内访问它以避免保留循环。

于 2013-07-12T15:47:12.643 回答
0

Ahmed Mohammed 是正确的,但是另一种可能的解决方案是将 myView 声明为属性,而不是 iVar 并执行以下操作:

-(void) startBlinker{
    __weak MyClass * weakSelf = self;

    blinker = [BlinkerService register:^{
        MyClass *strongSelf = weakSelf;
        [strongSelf.myView blink];
    }];

}

这样,您并不真正关心 strongSelf 是否为 nil。

于 2013-07-12T20:12:35.920 回答