什么时候在 Objective-C 中使用`self`?

Posted

技术标签:

【中文标题】什么时候在 Objective-C 中使用`self`?【英文标题】:When to use `self` in Objective-C? 【发布时间】:2011-11-07 10:56:54 【问题描述】:

现在我在 Objective-C 中已经 5 个多月了,我的第一个应用也在 App Store 中发布,但我仍然对该语言的核心功能存有疑问。

我应该什么时候使用self 访问 iVar,什么时候不应该使用?

释放出口时,您在 viewDidUnload 中写入 self.outlet = nil,而不是在 dealloc 中写入 [outlet release]。为什么?

【问题讨论】:

【参考方案1】:

当您编写self.outlet = nil 时,会调用方法[self setOutlet:nil];。当您编写 outlet = nil; 时,您会直接访问变量 outlet

如果您使用@synthesize outlet;,则自动生成方法setOutlet:,如果您将属性声明为@property (retain) NSObject outlet;,它会在分配新对象之前释放对象。

【讨论】:

到目前为止的最佳答案。【参考方案2】:

当您引用@property 时使用self。 通常是@synthesize'd。

如果您引用“私有”变量,则不要使用 self。通常,我为 UI 元素(例如 UIButtons)或我希望从其他类轻松访问的元素使用属性。 您可以使用@private、@protected 修饰符来明确强制可见性。但是,您不能使用 Objective-C 中不存在的私有方法。

关于 nil、release 和 dealloc 的部分与“self”的使用无关。您释放您保留的内容,您将自动保留的内容归零。

你应该阅读Objective-C guide,它写得很好,很有启发性。

【讨论】:

-1 是的,有私有变量之类的东西,请参阅@private。您关于使用 nil、release 和 dealloc 的推理也是不正确的。 self.foo 是一个属性。将其设置为 nil 会释放其 revious 值。 foo 是一个变量,将其设置为 nil 会导致旧值泄漏。不同之处在于,将属性设置为 nil 实际上是发送一条消息,导致旧值被释放。 @JeremyP 你完全正确。我的记忆让我失望了:/我对使用 nil 的推理并没有关闭(我的应用程序没有泄漏),我认为我选择的词语完全符合你自己所说的。我可能是一个糟糕的解释者,或者你可能已经得出错误的结论。无论如何,+1 用于刷新我对私人修饰符的记忆。 我已经删除了反对票,因为你修正了我反对的部分。我仍然认为你有关于使用 self 的东西。【参考方案3】:

了解objective c中的属性getter-setter方法非常重要的博客

                Understanding your (Objective-C) self

http://useyourloaf.com/blog/2011/2/8/understanding-your-objective-c-self.html

【讨论】:

【参考方案4】:

你使用自我。当您访问您所在的类的属性时(因此是自我)。基本上,当您想保留一个值时,您会使用 self ,但只有在您的属性定义中有保留时才使用。

release 只是释放你保留的对象。你不应该释放你没有保留的东西,因为它会导致崩溃(僵尸对象)。

【讨论】:

以上是关于什么时候在 Objective-C 中使用`self`?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C数据类型之id,SEL,BOOL,nil,NULL和NSNull

什么时候在 Objective-C 中使用`self`?

什么时候定义objective-c方法?

Objective-C 多线程

如何使用 Objective-C 在工具栏中显示图像

我啥时候应该在objective-c中释放这些对象?