何时使用 [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] [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python 实现各种进度条

泡菜错误断言id(obj)不在self.memo中

何时使用 sceneDidLoad v didMove(查看:)

__getattribute__(self, obj) 这个方法中的obj这个参数

如何检测真正的 iOS/APNS 推送令牌何时向 Firebase Cloud Messaging (FCM) 注册?

python中的__init__(self)是什么意思呢