fum*_*007 1 cocoa cocoa-touch objective-c
我只是想知道语义.什么时候真正成为对象的"属性"?我注意到有很多苹果的API,他们明确定义,而不是使用属性getter和setter方法(例如,URL
和setURL
上NSURLRequest
/ 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起作用的方法(当然除了设置一个属性),你很可能会声明并将其作为一种方法来调用它.如果访问(读取或写入)对象的属性,则更适合属性的任务.
归档时间: |
|
查看次数: |
185 次 |
最近记录: |