什么时候在 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`?的主要内容,如果未能解决你的问题,请参考以下文章