我只是想知道语义。什么时候真正成为对象的“属性”?我注意到在许多Apple的API中,他们明确定义了getter和setter而不是使用属性(例如URL
/ setURL
上的NSURLRequest
和NSMutableURLRequest
;当然,URL似乎是一个URL请求的“属性”,对吗?)我想知道是否有一些我遗漏的微妙的东西,或者Apple是否只是不喜欢这些属性。 = P
更新:从iOS 8开始,Apple已将大部分(如果不是全部)非属性getter和setter转换为属性。 (可能这样做可以使Swift兼容性更容易。)
答案 0 :(得分:8)
或者Apple如果不喜欢这些属性那么多。
真正的原因是,大部分的基金会框架(让我们不要忘记你在谈论NS*
课程)已经过时了 - 自从NeXT时代以来他们一直在那里......当时, Objective-C语言没有运用@property
关键字来模拟属性,程序员必须手动声明和实现getter和setter方法,这也适用于Apple的代码。
现在,基础框架非常基础,并没有发生太大变化。它没有被彻底改写,就我而言,编写它的程序员并不打算使用新语法重写所有代码。您可以看到最近添加的类确实具有声明属性而不是getter和setter,但对于较旧的类则不然。
无论如何,手动声明的属性和使用@property
和@synthesize
声明的属性完全等效。也就是说,访问它们时有一个非常小的区别,但这不属于声明的东西:如果你写的话
someObject.someProperty
在您的代码中,someObject
必须具有完整且具体的类型,因此如果名为someProperty
的属性不存在,您将收到编译器错误。相比之下,
[someObject someProperty]
和
[someObject setSomeProperty:]
即使未声明,也允许您进行方法调用。
修改强>
我问他们之间的语义差异是什么
因此,通过“语义差异”,您的意思是“何时应该使用”而不是“它是否以不同的方式运行”。我知道了。嗯......从概念上讲,属性代表状态。属性是对象的特定特征,可能随时间而变化。这是一个无关的事实,即使用Objecive-C中的访问器方法访问属性。
如果你编写一个对obejct起作用的方法(当然除了设置一个属性),你应该公平地将它作为方法声明并调用它。如果访问(读取或写入)对象的属性,则更适合属性的任务。
答案 1 :(得分:1)
使用getter和setter可以使用消息来访问项目
[myObject someProperty]
或[myObject setSomeProperty: someNewValue]
制作@property
的内容可让您额外使用点符号来调用getter和setter。这是因为@property
选择使类键值编码符合特定值的方法名称。
myObject.someProperty
或myObject.someProperty = someNewValue
虽然可以手动执行此操作,但是当您想要使用点表示法时,最好使用@property
。随着时间的推移,@property
和@synthesize
的幕后行为在关联指针的自动创建存储方面发生了相当大的变化。使用@property
可以更轻松地跟上Apple在约定中的变化,而代码很少或根本没有变化。
另外,使用@property
可以让您的代码更容易阅读。