我看到很多块在块中使用“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?
感谢任何形式的帮助,谢谢。
答案 0 :(得分:2)
Fonix的评论是正确的。有关详细信息,请查看Apple官方文档中的this页面。具体来看看"块可以从封闭范围中捕获值"部分。块中变量的含义始终是"捕获"当声明块时,所以局部变量,属性和对self
的引用都基于声明块的范围(在您的情况下,类A
中的范围)并且基于NOT在哪里调用块(在您的情况下,类B
)。
另一方面,关于使用块self
值得了解的一个微妙之处在于,您可以创建一种称为强引用循环或保留循环的内存泄漏(签出)关于弱属性here的部分以获得解释)。一般来说,总是在块中使用对自我的弱引用是很好的做法(Apple有一个很好的例子here)。大多数情况下,在一个区块中使用self
不会创建一个强大的参考周期,但如果你总是在一个区块中使用弱引用自我,你不必考虑是否或不存在参考周期的风险。