gpt4 book ai didi

objective-c - 在 Objective-C 中没有显式 @property 的情况下,点语法如何工作?

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

我按照 Apple 的约定编写了一个 setter 和 getter 方法,并注意到尽管没有变量,我仍然可以使用点语法访问 setter 和 getter。这是正常行为吗?是什么启用了此功能?

示例:

// Header definition. Keep in mind there is no class variable or @property for height.
- (void)setHeight:(float)height;
- (float)height;

// else using the dot syntax.
object.height = 10.0f;

最佳答案

属性访问表达式相当于消息表达式:

[object setTexture:tex];

属性声明相当于一个(readonly)或两个(readwrite/default)实例方法声明。像 retain 这样的关键字会告诉编译器如何实现该方法(如果您告诉编译器这样做的话)(@synthesize)。

但是,您可以跳过属性声明并直接声明方法,如问题所示。您无法综合它们的实现,因为您需要为此进行属性声明(否则,它不知道要使用什么内存管理策略:分配保留,或复制),但您始终可以自己实现这些方法。

然后,即使您自己声明和实现了这些方法,由于属性访问语法和消息语法彼此等效,您可以按照您想要的方式使用这些方法:使用消息表达式,或使用属性访问表达。

不过,有些人会认为在除正式 @property 以外的任何内容上使用属性访问表达式(例如,myString.lengthmyArray.计数myView.frame)。使用属性访问表达式发送不访问任何类型属性的消息绝对是不好的形式;例如,foo.retain.autorelease 是糟糕且错误的:它散发着试图假装您正在使用 Objective-C 之外的其他语言进行编程的味道。

顺便说一下,属性和变量是不相关的。 @property 通常由实例变量支持,但这不是必需的:您可以将属性的值存储在另一个对象中,或将其与其他格式相互转换,或两者兼而有之。同样,访问属性(这是一个访问器消息)和访问实例变量(只是访问变量,仅此而已)是非常不同的。

关于objective-c - 在 Objective-C 中没有显式 @property 的情况下,点语法如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844428/

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