首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iVars,有没有self?

iVars,有没有self?
EN

Stack Overflow用户
提问于 2010-07-23 21:23:50
回答 2查看 315关注 0票数 0

我只是对self在对象中扮演的角色感到好奇。我知道编写[[self dataForTable] count]直接引用该对象中包含的iVar。但是如果你错过了self而直接指定了iVar [dataTable count],这有什么不同,你用self来防止什么,仅仅是唯一地指定一个iVar,而不是一些类似的局部变量?

代码语言:javascript
复制
@implementation ViewController
@synthesize dataForTable;

...

NSUInteger dataCount = [[self dataForTable] count];

非常感谢

加里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 21:36:48

写入[self dataForTable count]并不直接引用iVar。有一些幕后的事情在进行...

如果你在代码中使用了ivar而不是self,那就是对ivar的直接访问。如果使用self someIvarName或self.someIvarName,实际上是在向对象(即self)发送一条消息。运行时尝试解析此消息,并将使用多种机制中的一种:如果您定义了一个具有匹配名称的方法,则将使用该方法,如果不存在此类方法(或属性),则键值编码将默认使用同名的ivar。

至于影响,这将根据您的代码而有所不同。例如,如果您的属性是保留属性(而不是已分配属性),则在以下属性之间存在非常显著的差异:

代码语言:javascript
复制
someVar = nil

代码语言:javascript
复制
self.someVar = nil

合成的设置器将在将someVar设置为nil之前正确地释放它,而在第一个示例中,您现在已经泄漏了内存。这只是其中一个不同的例子。

票数 1
EN

Stack Overflow用户

发布于 2010-07-23 21:38:00

[self foo]self上调用-foo方法(不是iVar,实例方法)。

self.bar使用@property语法访问bar iVar,方法是在self上调用getter/setter方法(-bar-setBar:)。

直接引用iVar而不使用“self”。(例如bar = @"some text")绕过getter/setter。如果设置器(例如)应该对新值执行copyretain,那么这可能是一件坏事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3318499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档