何时使用[self.obj message] vs [obj message]

时间:2011-06-20 16:33:15

标签: objective-c

  

可能重复:
  When to access properties with 'self'
  In Objective-C on iOS, what is the (style) difference between “self.foo” and “foo” when using synthesized getters?

例如,我有@property obj@synthesize。那么我什么时候需要在我的实现类中使用[self.obj message] vs [obj message]

4 个答案:

答案 0 :(得分:2)

使用self,将调用getter方法。因此,执行此getter方法中的任何其他逻辑。当实例变量通过其getter延迟加载时,这尤其有用。

我自己尝试在大多数时间使用self。延迟加载只是一个例子,另一个问题是self,子类可能会覆盖getter以获得不同的结果。

使用self设置变量更有用。它会触发KVO通知并自动处理内存管理(当然正确实施)

答案 1 :(得分:1)

以下是两个很好的教程,可以很好地解决这个问题:

Understanding your (Objective-C) self

When to use properties & dot notation

答案 2 :(得分:1)

当合成属性时,编译器会为您声明一个相关的ivar,默认情况下,ivar与属性名称相同。我建议始终使用self.obj来保持代码清洁,并避免一些潜在的错误。

我建议你遵循Apple的良好做法,@synthesize obj=_obj,ivar将成为_obj,当你打算使用属性时,这种风格迫使你直接写self.obj,由于ivar为obj,因此调用_obj将会出错。

编辑:自动创建属性的ivar只在现代的Objective-C运行时,在iOS SDK 4.0和Mac OS X 10.6中是安全的。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html%23//apple_ref/doc/uid/TP30001163-CH17-SW1

  

让@synthesize在遗产中工作   运行时,你必须提供一个   具有相同名称的实例变量   和兼容的财产类型或   指定另一个现有实例   @synthesize语句中的变量。   使用现代运行时,如果不这样做   提供一个实例变量,   编译器为你添加一个。

答案 3 :(得分:1)