我相信我在很大程度上理解属性。我的问题是,如果我有一个实例变量的属性,并且我在我的实现文件中的方法中设置或检索它,我应该使用self.myProperty
还是myProperty
?我知道其中一个有效,但我看到了混合约定,有时代码直接访问变量,有时则通过属性访问变量。
这样做有技术原因吗?这只是公约/个人偏好吗?而且我不是指方法的参数名称与实例变量名称冲突的实例,这可能是使用该属性的一个原因(至少,在其他语言中,我不知道这个一个)。我假设当在实现中使用属性时,他们想要利用它们声明属性的方式(即非原子,保留),所以例如在方法中,可以做:
self.myProperty = [someObject someAutoReleasedObject];
而不是:
myProperty = [[someObject someAutoReleasedObject] retain];
这是原因吗?那么只有某些情况下才能使用该属性吗?
我是Objective-C的新手,这是让我困惑的少数事情之一。到目前为止,我刚刚直接访问了实例变量,最可能的错误假设是,通过该属性实际上调用/发送方法/消息并增加了不必要的开销。我很确定我错了,但即使开销的差异可以忽略不计(如果有的话),当人们可以直接访问变量时,为什么会选择添加呢?
我很确定我的想法是错的,这就是我在这里问的原因。
答案 0 :(得分:5)
首先,根据Apple文档(并且有充分理由),你不应该在init或dealloc中使用setter或getter。
除此之外,如果有变量,通常应使用setter来设置变量。
通常我不打算使用getter从实现中访问ivar,但有时候有必要。特别是,如果您希望getter可以执行某些caclulation或检查,或者您希望允许子类覆盖该行为。
当然,在实现中使用getter更通用,更安全,但它通常也毫无意义且浪费。做出你的选择。
使用setter很重要,因为它为其他代码提供了观察更改的机会(Key Value Observing),以及子类有机会覆盖setter并进行任何其他调整。
然而,我强烈推荐的一件事是为您的ivar和您的财产使用不同的名称。普通约定是下划线前缀(_
),但我个人使用i_
作为前缀,以避免与Apple的私人使用混淆。这样你就不会意外地使用错误的那个:
self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
答案 1 :(得分:0)
如果您将该资产暴露给外界并且您在内部使用它,那么您应该在整个代码中使用该属性。原因是封装。假设您有SomeObj的“Id”属性。在某些时候,你决定替换Id行为的方式(也许你开始时Id是该类的成员var,并且通过evolution它变成了从数据库中检索的一段数据)。现在,您必须完成类实现,并使用数据库调用替换对成员var的所有引用。如果你有self.Id,你只需要覆盖getter。