直接访问实例变量时使用self-gt; ivar

时间:2009-08-21 20:53:57

标签: objective-c

我注意到大多数Objective-C编码器在直接访问实例变量时从不使用self->ivar语法。我看到的大多数示例代码只引用了没有self->的实例变量。我认为引用实例变量而不明确它是一个实例变量而不仅仅是当前范围的变量是相当混乱的。

我觉得我想要写下这样的东西:

- (void)dealloc {
    [self->someVar release];
    [self->anotherVar release];
    [super dealloc];
}

- (void)setVar:(Foo *)newVar {
    [self->var autorelease];
    self->var = [newVar retain];
}

在没有使用访问器进行封装​​的情况下,我们甚至不应该访问我们的实例变量,但有时我们需要在dealloc或自定义getter和setter中使用。

我是一个坏人/程序员吗?是不是有一些很好的理由不写这样的代码?因为这样做感觉非常好。

4 个答案:

答案 0 :(得分:7)

没有理由你不应该这样写。我认为人们倾向于以另一种方式写它,因为他们总是试图避免影响他们的ivars,所以他们所谈论的变量不应该有任何歧义 - 而且它更短。

答案 1 :(得分:7)

Chuck是正确的,因为没有技术的理由你不应该这样写,除非你用局部变量遮蔽ivars,这通常是一个坏主意。然而,可以说,省略self->在风格上更清晰,并且它肯定会导致更简洁的代码。就个人而言,我会发现self->会分散注意力(特别是如果代码设计得很好并且变量名称很好)但是如果它让事情更容易理解,那么一定要做。请注意,如果您向其他Objective-C程序员展示您的代码,他们可能会有一个相互矛盾的意见,所以有一个思考皮肤是好的。此外,大多数程序员发现他们对代码“感觉良好”的看法会随着时间的推移和经验而发生变化,而这些意见往往随着年龄的增长而变得圆满。 : - )

答案 2 :(得分:4)

简短的回答:不,因为那个你不是一个糟糕的程序员:)没有充分的理由不以这种方式编写代码;大多数程序员都只是懒惰,或者从来没有真正写过一辈子的精疲力竭的方法。

长答案:从技术上讲,当您访问没有“self->”的变量时,编译器将首先在本地范围内找到该名称的变量,如果找不到该变量,它将使用实例变量重复该搜索。如果它在那里找到了命中,它实际上会生成代码,好像在那里写了“self-gt; ...”。如果实例变量也没有匹配,编译器将在全局范围内尝试BTW。

大多数程序员只阅读自己的代码,他们非常清楚什么是实例变量,什么不是。一旦你不得不使用你自己没有编写的代码,这个方法的长度是4个屏幕(我有一个bigg屏幕),当程序员在每个变量访问时都清楚地表明你是非常感谢的:那个变量提供给方法调用的参数,此方法的局部变量,对象的实例变量,或者可能是全局变量(仅对此类的所有实例或可能是全局应用程序是全局变量)。你很感激,因为如果只有一堆具有相似名称且没有特殊命名或访问模式的变量,但是所有不同的类型,你很快就会失去监督。并且依赖于Xcode语法突出显示以与局部变量不同的方式突出显示实例变量的事实也是愚蠢的,因为没有程序员被迫在Xcode中编辑代码以开始,即使他这样做,他可能有一个颜色方案,其中实例变量与本地变量颜色相同。

通过self->访问实例变量完全没问题,但也可以考虑使用前缀/后缀,这也很明显这些是实例变量,也避免了与方法参数或局部变量的命名冲突。

答案 3 :(得分:1)

Objective C会自动将下划线附加到i-var名称,因此当您看到“_someVar”时,它隐含在类范围内。下划线足以使视觉标记在不添加自我>的情况下使其范围清晰。