使用'self.obj ='vs'_obj ='实例化对象是不对的

时间:2016-01-25 21:33:40

标签: objective-c

我不确定这实际上是否重要,但据我了解,Xcode会自动使用@property创建setter和getter。

因此我被告知,实例化self.obj = [[Obj alloc] init](与_obj = [[Obj alloc] init]相比)可能会有危险,因为self.obj将在对象可能尚不存在时通过setter (或类似的东西?)。

如果有人能澄清会很棒,谢谢。

2 个答案:

答案 0 :(得分:2)

在初始化程序中使用setter的主要问题是setter可能有副作用,这可能导致在初始化程序有机会正确设置对象之前使用该对象。

例如,有一个属性设置器,它在属性更改时发送通知。对于接收该通知的对象,访问发送方可能会导致问题,因为该对象尚未完全初始化,因此可能会生成未定义的行为。

另一方面,直接设置的ivars没有任何副作用且安全(r)。

假设您正在自动合成所有属性,您可能认为自己是安全的,是的,现在您可以在init中使用属性或ivar,但是您将来也不会知道您或某人否则为其中一个属性添加一个setter,所以最好保持安全。

答案 1 :(得分:2)

在绝大多数情况下,您应该使用self.obj。有两个常见的例外:

  • init
  • dealloc

在init期间,你通常不想调用setter,因为它可能有副作用,期望对象的其余部分处于一个理智的状态(它可能还没有)。

在dealloc期间,你通常不想调用setter,因为它可能有副作用,期望对象处于一个理智的状态(它可能不再是)。

除了这些情况之外,您通常希望使用self.obj,除非您有其他特定原因需要绕过设置器。