gpt4 book ai didi

objective-c - 直接访问 ivars 与使用访问器有何不同?

转载 作者:搜寻专家 更新时间:2023-10-30 20:11:18 25 4
gpt4 key购买 nike

所以在我看到的一些代码中,他们直接访问对象 ivar 而不是使用访问器。使用它们而不是访问器有什么优势?

那怎么会这样

thing = object->ivar 

和这个有区别吗?

thing = object.ivar

谢谢。

最佳答案

首先让我说,我完全讨厌 Objective-C 的点符号。它为了简洁而牺牲了可理解性,这是一件坏事。事实上,这里的其他两个答案都显示了点符号引入的那种混淆的证据。

在解决了问题之后,我现在将尝试回答这个问题。

在幕后,Objective-C 对象被实现为指向 C 结构的指针。这就是为什么

obj->ivar

有时有效。鉴于它是一个 C 结构

(*obj).ivar

也应该完全按照您对 C 的预期工作。话虽如此,您可以将 ivars 设为私有(private)或 protected ,在这种情况下,在它们可见的范围之外使用上述内容将导致编译器错误。

点运算符应用于 Objective-C 对象时(别忘了这是一个指针)具有完全不同的含义。它是向对象发送访问器消息的语法糖,意思是:

foo = obj.property;
obj.property = foo;

在效果上相同

foo = [obj property];
[obj setProperty: foo];

这就是点符号的全部内容。如果您通过代码将第一种形式的所有实例更改为第二种形式的实例,那么您已经完成了编译器使用点符号所做的一切。

特别是

  • 您不需要声明的@property 来使用点表示法。您可以以传统方式将 set 和 get 访问器声明为 Objective C 方法,尽管对逻辑属性的事物使用 @property 声明绝对是最佳实践。
  • 您不需要支持实例变量。您的 getter 和 setter 没有理由不能计算值。

综上所述,obj->ivarobj.ivar的主要区别是前者直接修改ivar,后者调用访问器,这意味着后者可以执行任何需要的内存管理工作(保留、释放、复制等),还可以调用键值观察。

关于objective-c - 直接访问 ivars 与使用访问器有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952083/

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