或者,如果 Apple 只是不太喜欢属性。
真正的原因是大多数 Foundation 框架(别忘了你在谈论NS*
类)已经过时了——它们从 NeXT 时代就已经存在了……当时,Objective-C 语言还没有运动@property
关键字 - 为了模拟属性,程序员必须手动声明和实现 getter 和 setter 方法,这也适用于 Apple 的代码。
现在,Foundation 框架是如此基础,以至于它并没有发生太大变化。它没有被彻底重写,就我而言,编写它的程序员并没有费心使用新语法重写所有代码。您可以看到最近添加的类实际上具有声明的属性而不是 getter 和 setter,但对于较旧的类而言并非如此。
无论如何,手动声明的属性和使用@property
and声明的属性@synthesize
是完全等价的。也就是说,访问它们时有一个非常小的区别,但这不属于声明的东西:如果你写
someObject.someProperty
在您的代码中,someObject
必须有一个完整且具体的类型,因此如果一个名为的属性someProperty
不存在,您将收到编译器错误。相比之下,
[someObject someProperty]
和
[someObject setSomeProperty:]
即使未声明,也允许您调用方法。
编辑:
我问他们之间的语义区别是什么
因此,通过“语义差异”,您的意思是“何时应该使用”而不是“它的运行方式是否不同”。我懂了。嗯...从概念上讲,属性代表状态。属性是可能随时间变化的对象的特定特征。使用Objecive-C中的访问器方法访问属性只是一个不相关的事实。
如果您编写了一个作用于对象的方法(当然,除了设置属性之外),您很有可能应该将其声明为方法并将其调用。如果您访问(读取或写入)对象的属性,则更适合属性的任务。