何时使用属性与普通ol'吸气剂和二传手

时间:2013-03-09 18:34:54

标签: objective-c cocoa-touch cocoa

我只是想知道语义。什么时候真正成为对象的“属性”?我注意到在许多Apple的API中,他们明确定义了getter和setter而不是使用属性(例如URL / setURL上的NSURLRequestNSMutableURLRequest;当然,URL似乎是一个URL请求的“属性”,对吗?)我想知道是否有一些我遗漏的微妙的东西,或者Apple是否只是不喜欢这些属性。 = P

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

2 个答案:

答案 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.somePropertymyObject.someProperty = someNewValue

虽然可以手动执行此操作,但是当您想要使用点表示法时,最好使用@property。随着时间的推移,@property@synthesize的幕后行为在关联指针的自动创建存储方面发生了相当大的变化。使用@property可以更轻松地跟上Apple在约定中的变化,而代码很少或根本没有变化。

另外,使用@property可以让您的代码更容易阅读。