我应该总是使用self.class变量吗?

时间:2011-12-01 15:50:56

标签: iphone objective-c self

编写我的iPhone应用程序时。设置或获取使用自我的值时,这总是一个好习惯吗?我似乎忘记了一半的时间,最近一直在追查我认为与此相关的错误。

我是否应该一直使用自己,或者在没有必要或会引起问题的情况下使用?

编辑: 这是我在代码

中所做的一个例子
else if([CellIdentifier isEqualToString:@"Linked Item"]) {
        linkedItemLabel = [[UILabel alloc] initWithFrame:CGRectMake(120, 5, 160, 34)];
        linkedItemLabel.adjustsFontSizeToFitWidth = YES;
        linkedItemLabel.textColor = [UIColor blackColor];
        linkedItemLabel.font = [UIFont systemFontOfSize:17.0];
        linkedItemLabel.text = [storedValuesMutableArray objectAtIndex:7];
        linkedItemLabel.backgroundColor = [UIColor clearColor];
        linkedItemLabel.textAlignment = UITextAlignmentRight;
        [cell addSubview:linkedItemLabel];}

这是为需要填充的表单设置tableviewcells的代码的一部分。我应该使用self.linkedItemLabel还是这样可以吗?

4 个答案:

答案 0 :(得分:2)

你必须明白使用self.property是方法调用(getter或setter方法),而不是简单的赋值。

你应该只在setter或getter体内直接使用ivar。

原因:

1 /属性旨在保护你免受保留释放的地狱。让我们假设您有一个“assign”属性,您直接使用ivar然后决定将其更改为“retain”。你得到的是一个很难找到的bug。

2 / Setter和getter可以执行其他功能(例如,setter可以向对象添加/删除观察者)或记录。如果您直接使用ivar,则会错过此特殊功能。

3 /可以在子类中覆盖Setter和getter。

在小型项目中,即使您直接使用ivars,也可以避免大多数问题,但是在团队编程的大项目中,您应该只使用self.property来减少错误并提高代码可维护性。 为您的ivar添加不同的名称(例如property__property也是一个好主意,因为您在没有self.的情况下使用它时会注意到。

如果您没有编写高性能游戏或数学算法,请不要担心使用self.property时性能会下降。

答案 1 :(得分:1)

这取决于具体情况,如果您只是使用@synthesize来自动生成getter,那么它不会对getter造成任何问题。虽然常见的OO实践告诉您使用encapsulation,但您会注意到几乎所有的Apple示例代码都直接访问ivar

在不使用self的情况下引用ivar的另一种常见做法是合成这样的:

@synthesize myVar=_myVar

并在引用该变量时使用_myVar。

如果您在getter中实现了某些内容,而不是使用@synthesize,则只会导致问题。

对于setter来说,这不是一个问题,但你必须记住,只有当你使用self.myIvar而不是直接访问iVar时才会应用该ivar的属性,所以对于例如,声明为(retain)的属性只有在self.myIvar = newValue a反对myIvar = newValue时才会被保留。

答案 2 :(得分:0)

问题出现在属性上。如果你没有添加self。,那么你最终会直接分配给变量,错过了属性属性,例如保留,分配并因此搞乱项目的引用计数,从而导致潜在的内存泄漏。

你应该使用自己,除非你有明确的理由不这样做。

答案 3 :(得分:0)

你必须巧妙清楚地理解它。 如果您正在使用所谓的点语法(即self.myVariable),则意味着您正在调用该属性的getter或setter,这实际上是一个发送到对象实例的选择器,它非常重在Objective-C运行时内。因此,如果您只需要var的值 - 您可以调用一次并重用已保存的状态或直接调用i-var(如果权限允许)。

当你真正需要时,请求getter / setter。