gpt4 book ai didi

objective-c - 何时使用属性与普通的 getter 和 setter

转载 作者:行者123 更新时间:2023-12-03 16:49:36 25 4
gpt4 key购买 nike

我只是想知道语义。什么时候某物真正成为物体的“属性”?我注意到在很多Apple的API中,它们明确定义了getter和setter,而不是使用属性(例如URLsetURL上的NSURLRequest/NSMutableURLRequest;当然,URL看起来像是URL请求的“属性” ,对吧?)我想知道我是否遗漏了一些微妙的东西,或者苹果是否只是不太喜欢属性。 =P

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

最佳答案

or if Apple just doesn't like properties all that much.

真正的原因是大多数基础框架(我们不要忘记你正在谈论 NS* 类)已经很古老了 - 它们从下一个时代就已经存在了......当时,Objective-C 语言还没有 @property 关键字 - 为了模拟属性,程序员需要手动声明和实现 getter 和 setter 方法,这适用于 Apple 的代码也是如此。

现在 Foundation 框架已经非常基础了,没有发生太大变化。它并没有被彻底重写,就我而言,编写它的程序员并没有费心使用新语法重写所有代码。您可以看到,最近添加的类实际上具有声明的属性,而不是 getter 和 setter,但对于较旧的类而言并非如此。

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

someObject.someProperty

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

[someObject someProperty]

[someObject setSomeProperty:]

即使未声明,也允许您调用该方法。

编辑:

I ask what the semantic difference between them is

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

如果您编写一个作用于对象的方法(当然,除了设置属性之外),您很有可能应该将其声明为方法并将其调用。如果您访问(读取或写入)对象的属性,则更适合属性的任务。

关于objective-c - 何时使用属性与普通的 getter 和 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com