Jor*_*eña 11 language-features properties conventions objective-c
我相信我在很大程度上理解属性.我的问题是,如果我有一个实例变量的属性,并且我在我的实现文件中的方法中设置或检索它,我应该使用self.myProperty还是只是myProperty?我知道其中一个有效,但我看到了混合约定,有时代码直接访问变量,有时则通过属性访问变量.
这样做有技术原因吗?这只是公约/个人偏好吗?而且我不是指方法的参数名称与实例变量名称冲突的实例,这可能是使用该属性的一个原因(至少,在其他语言中,我不知道这个).我假设当一个人在实现中使用该属性时,他们想要利用他们声明属性的方式(即非原子,保留),所以例如在方法中,人们可以这样做:
self.myProperty = [someObject someAutoReleasedObject];
Run Code Online (Sandbox Code Playgroud)
代替:
myProperty = [[someObject someAutoReleasedObject] retain];
Run Code Online (Sandbox Code Playgroud)
这是什么原因?那么只有某些情况才能使用该物业吗?
我是Objective-C的新手,这是让我困惑的少数事情之一.到目前为止,我刚刚直接访问了实例变量,最可能的错误假设是,通过属性实际调用/发送方法/消息并增加了不必要的开销.我很确定我错了,但即使开销的差异可以忽略不计(如果有的话),为什么只要直接访问变量就可以选择加入?
我很确定我的想法是错的,这就是我在这里问的原因.
首先,根据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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |