何时使用 [self.obj message] vs [obj message] [重复]
Posted
技术标签:
【中文标题】何时使用 [self.obj message] vs [obj message] [重复]【英文标题】:When to use [self.obj message] vs [obj message] [duplicate] 【发布时间】:2011-06-20 16:33:15 【问题描述】:可能的重复: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?
例如,我有一个名为 obj
的 @property
和 @synthesize
它。那么我什么时候需要在我的实现类中使用[self.obj message]
和[obj message]
。
【问题讨论】:
页面右上角有一个搜索框。用它。这个问题之前已经被问过十几次了。 【参考方案1】:使用self
,会调用getter方法。因此,执行此 getter 方法中的任何附加逻辑。当实例变量通过其 getter 进行延迟加载时,这尤其有用。
我自己大部分时间都尝试使用self
。延迟加载只是一个例子,另一件事是self
,子类可能会覆盖getter以获得不同的结果。
使用self
设置变量更加有用。它将触发 KVO 通知并自动处理内存管理(当然,如果实施得当)
【讨论】:
优秀的延迟加载。逻辑集中在 getter 中。【参考方案2】:这里有两个很好的教程很好地涵盖了这个问题:
Understanding your (Objective-C) self
When to use properties & dot notation
【讨论】:
这些例子真的很有帮助。谢谢。【参考方案3】:在合成属性时,编译器会为你声明一个相关的ivar,默认情况下,ivar与属性名相同。我建议始终使用 self.obj 以保持代码更干净,并避免一些潜在的错误。
我建议你遵循Apple的良好做法,@synthesize obj=_obj
,ivar将变为_obj
,当你的意思是使用属性时,这种风格强迫你写self.obj
,直接调用obj
将是错误,因为 ivar 是 _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 语句中的变量。 使用现代运行时,如果您不 提供一个实例变量, 编译器会为你添加一个。
【讨论】:
属性用于快速声明高效的getter(和setter),不会创建实例变量。 @Joost 在旧的 Objective-C 运行时确实如此,但在现代运行时,该属性实际上是为您创建一个 ivar。 感谢您的文档链接,我撤销了我的反对票。【参考方案4】:以后,请搜索网站。您经常会发现您所问的确切问题以前曾被问过:
difference between accessing a property via "propertyname" versus "self.propertyname" in objective-c? When to access properties with 'self' self.variable and variable difference Objective-C: When to call self.myObject vs just calling myObject iVar property, access via self? Should I Use self Keyword (Properties) In The Implementation? In Objective-C on iOS, what is the (style) difference between "self.foo" and "foo" when using synthesized getters? When to use self on class properties?...等等
【讨论】:
我下次一定会这样做的。以上是关于何时使用 [self.obj message] vs [obj message] [重复]的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 sceneDidLoad v didMove(查看:)
__getattribute__(self, obj) 这个方法中的obj这个参数