我有一个块,它使用自身的弱引用来访问块内的属性。访问这些属性时,我使用
__weak ViewController *weakSelf = self;
someBlock = ^{
ViewController *safeSelf = weakSelf;
weakSelf.someObject
safeSelf->someObject
}
当使用weakself时,使用点语法的原因是什么,以及弱引用的强引用,使用 - >语法
答案 0 :(得分:2)
object->iVar
语法直接访问实例变量,而不使用属性。
你应该忘记你曾经看过这个,永远不要使用它(直到你达到了解冷却这个东西的程度,找到你需要的.01%边缘情况。)
该语法允许您访问另一个对象并直接访问它的实例变量,这是不好的做法。属性允许您控制对对象的公共接口的访问,并维护对象的封装。
__weak weakSelf约定用于代码块。代码块从其封闭范围捕获对变量的强引用,并且可以导致保留循环,因为您的对象具有对该块的强引用,并且该块通过对self
的引用具有对该对象的强引用。通过创建一个弱变量weakSelf,可以使块对所拥有它的对象的引用变弱,并避免保留周期。
答案 1 :(得分:0)
->
直接访问实例变量。 weakSelf.someObject
相当于[weakSelf someObject]
。
除非您有特定原因(如性能)或跳过KVO,否则您可能不希望使用->
。通常,最好使用属性访问。
附注:除了创建weakSelf
之外,您不应该使用safeSelf
。之后,您应该从safeSelf
获得所需的一切。 (weakSelf
如果不再有对该对象的强引用,则可以随时转为nil
。)
答案 2 :(得分:0)
weakSelf.someObject
safeSelf->someObject
他们都很傻。在块的第一行建立了一个强大的safeSelf
,你应该确保它不是nil,然后使用普通的属性(点)语法专门使用它,这样你就可以通过访问器方法获得任何好处它有(可能包括线程安全):
safeSelf.someObject
你肯定不想要使用->
。这里的问题是您对self
的引用可能为零 - 并且在零对象上使用->
是一种灾难。