11

我相信我在很大程度上了解属性。我的问题是,如果我有一个实例变量的属性,并且我正在我的实现文件的方法中设置或检索它,我应该使用self.myProperty还是只使用myProperty?我知道任何一个都有效,但我看到了混合约定,有时代码直接访问变量,有时通过属性访问。

这样做有技术原因吗?这只是惯例/个人喜好吗?而且我不是指方法的参数名称与实例变量名称冲突的实例,这可能是使用该属性的一个原因(至少,在其他语言中,我不知道这个)。我假设当一个人在实现中使用该属性时,他们希望利用他们声明该属性的方式(即非原子,保留),因此例如在一种方法中,可以这样做:

self.myProperty = [someObject someAutoReleasedObject];

代替:

myProperty = [[someObject someAutoReleasedObject] retain];

这是原因吗?那么只有在某些情况下使用该物业会更好吗?

我是 Objective-C 的新手,这是少数让我感到困惑的事情之一。到目前为止,我只是在最可能的错误假设下直接访问了实例变量,即通过属性实际上调用/发送了方法/消息并增加了不必要的开销。我很确定我错了,但是即使开销的差异可以忽略不计(如果有的话),当人们可以简单地直接访问变量时,为什么还要选择添加它呢?

我很确定我的想法是错误的,这就是我在这里问的原因。

4

2 回答 2

5

首先,根据 Apple 文档(并且有充分的理由),您不应该在 init 或 dealloc 中使用 setter 或 getter。

除此之外,您通常应该使用 setter 来设置变量(如果有的话)。

通常我不会费心使用 getter 从实现中访问 ivar,但有时它是必要的。特别是,如果您希望 getter 可能会进行一些计算或检查,或者您希望允许子类覆盖该行为。

当然,在实现中使用 getter 更通用、更安全,但它通常也毫无意义和浪费。做出你的选择。

使用 setter 很重要,因为它为其他代码提供了观察更改(键值观察)的机会,并且子类有机会覆盖 setter 并进行所需的任何其他调整。

然而,我强烈推荐的一件事是为您的 ivar 和您的财产使用不同的名称。正常的约定是下划线前缀 ( _),尽管我个人将i_其用作前缀以避免与 Apple 的私人用法混淆。这样你就不会意外使用错误的:

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
于 2009-06-27T03:05:31.667 回答
0

如果您将属性暴露给外部世界并且您在内部使用它,那么您应该在整个代码中使用该属性。原因是封装。假设您有 SomeObj 的“Id”属性。假设在某个时候您决定替换 Id 的行为方式(也许您从 Id 作为类的成员 var 开始,并且通过进化它成为从数据库中检索的一条数据)。现在您必须完成您的类实现,并将所有对成员 var 的引用替换为数据库调用。如果你有 self.Id,你只需要覆盖 getter。

于 2009-06-26T22:39:18.037 回答