iOS版。 “自我”在派遣区块中意味着什么?

时间:2015-07-27 01:45:01

标签: ios objective-c

我看到很多块在块中使用“self.xxx”,那么如何确保“self”是我想要的实例? 例:  我在实例A,其代表是B.  然后我打电话给[A.delegate dispatchBlockTest]  实例B中的dispatchBlockTest如下所示:

dispatch_async(dispatch_get_main_queue(DISPATCH_UEUE_PRIORITY_DEFAULT, 0),^{
        [self printClassName];
    });
});

那么,街区中的“自我”肯定是B?不是A?

感谢任何形式的帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

Fonix的评论是正确的。有关详细信息,请查看Apple官方文档中的this页面。具体来看看"块可以从封闭范围中捕获值"部分。块中变量的含义始终是"捕获"当声明块时,所以局部变量,属性和对self的引用都基于声明块的范围(在您的情况下,类A中的范围)并且基于NOT在哪里调用块(在您的情况下,类B)。

另一方面,关于使用块self值得了解的一个微妙之处在于,您可以创建一种称为强引用循环或保留循环的内存泄漏(签出)关于弱属性here的部分以获得解释)。一般来说,总是在块中使用对自我的弱引用是很好的做法(Apple有一个很好的例子here)。大多数情况下,在一个区块中使用self不会创建一个强大的参考周期,但如果你总是在一个区块中使用弱引用自我,你不必考虑是否或不存在参考周期的风险。