我应该在实施中使用自我关键字(属性)吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

可以做:

self.myProperty = [someObject someAutoReleasedObject];

代替:

myProperty = [[someObject someAutoReleasedObject] retain];

这是什么原因?

为什么只要直接访问变量就可以选择加入?

提问于
用户回答回答于

首先,根据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
用户回答回答于

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

所属标签

可能回答问题的人

  • 天使的炫翼

    15 粉丝531 提问35 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    48 粉丝0 提问27 回答
  • 富有想象力的人

    2 粉丝0 提问26 回答
  • 发条丶魔灵1

    6 粉丝525 提问25 回答

扫码关注云+社区

领取腾讯云代金券