最佳答案
我通常会看到这个问题以另一种方式提出,比如 每个变量都必须是一个属性吗?(我喜欢 bbum 对这个问题的回答)。
我几乎只在代码中使用属性。然而,我偶尔会和一个承包商合作,他已经在 iOS 上开发了很长时间,是一个传统的游戏程序员。他编写的代码几乎没有声明任何属性,而是依赖于 ivar。我猜他这么做是因为1。)他已经习惯了,因为在 Objective C 2.0(2007年10月)和2之前,属性并不总是存在。)为了不通过 getter/setter 获得最小的性能增益。
虽然他编写的代码不会泄漏,但我仍然希望他使用属性而不是 ivar。我们讨论过这个问题,他或多或少认为没有理由使用属性,因为我们没有使用 KVO,而且他有处理内存问题的经验。
我的问题是... 为什么你会想要使用 IVAR 时期-经验丰富与否。使用 ivar 真的有那么大的性能差异吗?
另外,作为澄清的一点,我根据需要覆盖 setter 和 getter,并使用与 getter/setter 内部的属性相关联的 ivar。但是,在 getter/setter 或 init 之外,我总是使用 self.myProperty
语法。
我很感激所有的好回答。我想解决的一个看起来不正确的问题是,使用一个 ivar 可以得到封装,而使用一个属性则不能。只需在类继续中定义属性。这样就不会被外人发现。您还可以在接口中声明该属性 readonly,并在实现中将其重新定义为 readwrite,如下所示:
// readonly for outsiders
@property (nonatomic, copy, readonly) NSString * name;
并在课堂上继续:
// readwrite within this file
@property (nonatomic, copy) NSString * name;
要使它完全“私有”,只能在类继续中声明它。