访问属性时,点语法和“ - >”之间有什么不同

时间:2014-05-14 14:21:54

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

我有一个块,它使用自身的弱引用来访问块内的属性。访问这些属性时,我使用

__weak ViewController *weakSelf = self;
someBlock = ^{

ViewController *safeSelf = weakSelf;

weakSelf.someObject
safeSelf->someObject

}

当使用weakself时,使用点语法的原因是什么,以及弱引用的强引用,使用 - >语法

3 个答案:

答案 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的引用可能为零 - 并且在零对象上使用->是一种灾难。