1

我只是想知道语义。什么时候真正成为对象的“属性”?我注意到在许多 Apple 的 API 中,它们明确定义了 getter 和 setter,而不是使用属性(例如URLsetURLon NSURLRequest/ NSMutableURLRequest;当然 URL 看起来像是 URL 请求的“属性”,对吧?)我想知道是否有一些微妙的我缺少的东西,或者Apple只是不太喜欢属性。=P

更新:从 iOS 8 开始,Apple 已将大部分(如果不是全部)非属性 getter 和 setter 转换为属性。(可能这样做是为了更容易兼容 Swift。)

4

2 回答 2

8

或者,如果 Apple 只是不太喜欢属性。

真正的原因是大多数 Foundation 框架(别忘了你在谈论NS*类)已经过时了——它们从 NeXT 时代就已经存在了……当时,Objective-C 语言还没有运动@property关键字 - 为了模拟属性,程序员必须手动声明和实现 getter 和 setter 方法,这也适用于 Apple 的代码。

现在,Foundation 框架是如此基础,以至于它并没有发生太大变化。它没有被彻底重写,就我而言,编写它的程序员并没有费心使用新语法重写所有代码。您可以看到最近添加的类实际上具有声明的属性而不是 getter 和 setter,但对于较旧的类而言并非如此。

无论如何,手动声明的属性和使用@propertyand声明的属性@synthesize是完全等价的。也就是说,访问它们时有一个非常小的区别,但这不属于声明的东西:如果你写

someObject.someProperty

在您的代码中,someObject必须有一个完整且具体的类型,因此如果一个名为的属性someProperty不存在,您将收到编译器错误。相比之下,

[someObject someProperty]

[someObject setSomeProperty:]

即使未声明,也允许您调用方法。

编辑:

我问他们之间的语义区别是什么

因此,通过“语义差异”,您的意思是“何时应该使用”而不是“它的运行方式是否不同”。我懂了。嗯...从概念上讲,属性代表状态。属性是可能随时间变化的对象的特定特征。使用Objecive-C中的访问器方法访问属性只是一个不相关的事实。

如果您编写了一个作用于对象的方法(当然,除了设置属性之外),您很有可能应该将其声明为方法并将其调用。如果您访问(读取或写入)对象的属性,则更适合属性的任务。

于 2013-03-09T18:48:16.510 回答
1

拥有 getter 和 setter 让您可以使用消息来访问项目

[myObject someProperty]或者[myObject setSomeProperty: someNewValue]

制作 a@property使您能够使用点符号来调用 getter 和 setter。这是因为@property选择了使类键值编码符合特定值的方法名称。

myObject.someProperty 或者myObject.someProperty = someNewValue

虽然可以手动执行此操作,@property但当您想要使用点表示法时,它被认为是最佳实践。随着时间的推移,幕后的行为@property发生@synthesize了很大的变化,特别是在为关联指针自动创建存储方面。使用@property它可以更轻松地跟上 Apple 对约定的更改,而您的代码几乎没有更改。

此外,使用@property使您的代码更易于阅读。

于 2013-03-09T18:41:29.710 回答