何时使用属性与普通的'getter和setter

fum*_*007 1 cocoa cocoa-touch objective-c

我只是想知道语义.什么时候真正成为对象的"属性"?我注意到有很多苹果的API,他们明确定义,而不是使用属性getter和setter方法(例如,URLsetURLNSURLRequest/ NSMutableURLRequest;肯定的URL看起来像一个URL请求的"财产",不是吗?)我不知道是否有一些微妙我缺少的东西或苹果公司不喜欢这些特性.= P

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

小智 8

或者,如果Apple不喜欢这些属性.

真正的原因是大部分的基础框架(让我们不要忘记你在谈论NS*课程)已经过时了 - 自NeXT时代以来他们一直在那里......当时,Objective-C语言没有运行@property关键字 - 模拟属性,程序员必须手动声明和实现getter和setter方法,这也适用于Apple的代码.

现在,基金会框架非常基础,并没有发生太大变化.它没有彻底改写,就我而言,编写它的程序员并不打算使用新语法重写所有代码.您可以看到最近添加的类确实具有声明属性而不是getter和setter,但对于较旧的类则不然.

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

someObject.someProperty
Run Code Online (Sandbox Code Playgroud)

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

[someObject someProperty]
Run Code Online (Sandbox Code Playgroud)

[someObject setSomeProperty:]
Run Code Online (Sandbox Code Playgroud)

允许你进行方法调用,即使它是未声明的.

编辑:

我问他们之间的语义差异是什么

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

如果你编写一个对obejct起作用的方法(当然除了设置一个属性),你很可能会声明并将其作为一种方法来调用它.如果访问(读取或写入)对象的属性,则更适合属性的任务.

  • @ fumoboy007:第一个答案是H2CO3,我已经说过,他们根本没有重写整个基金会来使用新功能.第二个我不觉得我现在有时间回答,但我相信有人会来.在一个句子中,属性用于状态,方法用于操作. (3认同)
  • H2CO3在所有这些方面都是正确的,但只有一个小注:访问器声明和属性以及*几乎*等效.他们有一个微小的差别.声明为属性的事物将由`class_copyPropertyList()`返回,而方法声明的访问器则不会.这是一个非常小的差异,但如果你正在进行内省,偶尔会有问题.在ObjC的伟大方案中,属性是相当新的,并且由于它们与现有功能重叠,即使在经验丰富的开发人员中,您仍然会看到它们的使用中存在一些微小的不一致.有点这是品味问题. (2认同)