2

在我从 Apple 和其他地方在线阅读的大多数 iOS SDK 教程中,很多实例变量都是属性,即使它们只能从它们自己的类中访问。

EG 在 Facebook 最新的 iOS SDK 中,鼓励用户维护facebook在应用程序委托中调用的 Facebook 类的实例。facebook"是一个属性。然后在整个示例代码中将其称为“self.facebook”。但是“facebook”属性没有从应用程序委托之外的任何地方引用。

为什么是这样?我错过了什么?如果一个实例变量只在它自己的类中使用,我的倾向是把它变成一个属性,这样它就不是公开可见的,而是简单地在类中facebook而不是self.facebookself->facebook从类中引用它。

坦率地说,即使我需要 facebook 属性,我想我宁愿在应用程序委托中将其简单地称为“facebook”而不是“self.facebook”。

那么给了什么?为什么我到处都能看到房产?

4

6 回答 6

7

属性与 iVar 是否公开无关。相反,属性创建了管理保留和促进封装的访问器方法。

如果你想要一个私有属性,只需在@private指令下声明 ivar,然后在实现文件中定义属性。

于 2010-11-30T21:22:05.860 回答
4

为什么你应该使用属性的一个很好的例子(你可以像 TechZen 所说的那样将属性设为私有),就是在 viewDidLoad 中创建新实例。

人们总是这样做,因为每个视图控制器实例都会调用一次。或者,您认为...实际上,由于应用程序收到内存警告时会发生什么,因此每个实例可能会多次调用 viewDidLoad 类。

因此,例如,您可能会编写如下代码:

- (void) viewDidLoad
{ myArray = [[NSMutableArray alloc] init]; }

效果很好 - 直到它再次被调用,然后你就有了泄漏。您可以在分配之前释放 myArray 以防万一 - 但问题是这是一个容易忘记的步骤。

如果您为每个实例变量使用属性,那么您的代码如下所示:

- (void) viewDidLoad
{ self.myArray = [NSMutableArray array]; }

现在你不能弄错了。如果 viewDidLoad 被多次调用,旧数组将被释放,一个新数组将代替它,而不会泄漏旧数组。

于 2010-11-30T21:47:31.673 回答
3

通常最好通过访问器访问实例变量,而不是直接访问。属性创建这些访问器,并提供诸如适当的键值更改通知和原子访问之类的东西。

于 2010-11-30T19:15:50.240 回答
3

属性可以生成 getter 和 setter。特别是,设置器可以帮助(半)自动管理对象的保留/释放计数,从而减少某些类型的潜在内存错误。

非对象的 getter 和属性主要用于编码风格的正交性,尽管它们确实有可能在将来的代码扩展或重用中用于 mutators、键值通知等。

可能存在一些效率差异/缺点,但这取决于使用的特定 ObjC 运行时。

于 2010-11-30T19:27:36.377 回答
1

如果您引用 facebook,那么它将直接访问变量,如果您访问 self.facebook,那么它将通过 setter/getter 方法。

结果是,如果您需要改变一个对象或在稍后的某个时间点,您需要在更改值的过程中做其他事情(即装箱),那么您可以将它放在 setter 方法中并减少必须做的事情它无处不在。那是一件好事。

于 2010-11-30T19:08:14.637 回答
0

它会自动为您创建 getter/setter。另外,这是一篇很好的文章,解释了它的属性

于 2010-11-30T19:07:13.670 回答