我不确定这实际上是否重要,但据我了解,Xcode会自动使用@property
创建setter和getter。
因此我被告知,实例化self.obj = [[Obj alloc] init]
(与_obj = [[Obj alloc] init]
相比)可能会有危险,因为self.obj
将在对象可能尚不存在时通过setter (或类似的东西?)。
如果有人能澄清会很棒,谢谢。
答案 0 :(得分:2)
在初始化程序中使用setter的主要问题是setter可能有副作用,这可能导致在初始化程序有机会正确设置对象之前使用该对象。
例如,有一个属性设置器,它在属性更改时发送通知。对于接收该通知的对象,访问发送方可能会导致问题,因为该对象尚未完全初始化,因此可能会生成未定义的行为。
另一方面,直接设置的ivars没有任何副作用且安全(r)。
假设您正在自动合成所有属性,您可能认为自己是安全的,是的,现在您可以在init中使用属性或ivar,但是您将来也不会知道您或某人否则为其中一个属性添加一个setter,所以最好保持安全。
答案 1 :(得分:2)
在绝大多数情况下,您应该使用self.obj
。有两个常见的例外:
init
dealloc
在init期间,你通常不想调用setter,因为它可能有副作用,期望对象的其余部分处于一个理智的状态(它可能还没有)。
在dealloc期间,你通常不想调用setter,因为它可能有副作用,期望对象处于一个理智的状态(它可能不再是)。
除了这些情况之外,您通常希望使用self.obj
,除非您有其他特定原因需要绕过设置器。