编写我的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还是这样可以吗?
答案 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。