gpt4 book ai didi

iOS/Objective-C - struct objc_class * 和 struct objc_object *

转载 作者:可可西里 更新时间:2023-11-01 05:03:16 27 4
gpt4 key购买 nike

我的理解是,Objective-C 中的对象 只是结构

分别是:

struct objc_class *

和:

struct objc_object *

问题 #1:

objc_msgSend(id self, SEL _cmd);

id 据我所知是 struct objc_object *

类型

但是当我们调用一个类的方法,一个类型为struct objc_class *的类,

我希望它会引起问题或发出某种警告,例如“嘿,我的 friend ,这里输入错误”。

但是没有。

  • 为什么?

这只是为了满足我的好奇心,因为即使没有完全理解这一点,它似乎也没有给我带来任何麻烦(到目前为止)。但我想深入挖掘并学习基础知识/“特性”。

问题 #2:

由于根据我的经验没有警告(与问题 #1 相关),因此我不确定他们可能 可互换使用。

struct objc_class *struct objc_object * 真的可以互换使用吗?

如果是:

  • 您能否向我展示一个场景和示例,我们何时/如何/为什么需要互换使用它们?

  • 什么是好处(如果有)、缺点(如果有)和“陷阱”(需要注意的事情出于;如果有的话)这样做?

最佳答案

My understanding is that objects and classes in Objective-C are just structs.

这不是真的,特别是自 ObjC2 以来,绝对不是一个好的思考方式。所讨论的“结构”定义了一个字段 (isa)。而已。它只是名义上的“结构”。

请注意,在 ARC 下,编译器对对象和结构的处理方式不同。对象指针将得到结构指针不会得到的特殊处理(包括 nil 初始化)。编译器还将 -> 应用到对象而不是结构。结构指针必须有一个字段,其名称在 -> 之后给出。 objc_object 只有一个字段(isa)。由于可以在运行时定义和重新定义类层次结构,因此编译器无法像对结构那样在编译时对对象求值 ->

我提出这一点是因为在 C++ 中,对象和结构只是同一事物的略微不同版本,您可以轻松地在它们之间进行交换。你不能在 ObjC 中安全地这样做。它们几乎没有那么相似。

But when we call a class method, a class, which is of type struct objc_class *, I would expect it to cause problem…

This is because classes are objects.对象不是根据 objc_object 类型定义的。它们是根据具有 isa 字段(它曾经是一个指针,但现在它可能是一个指针,or it might not)来定义的。这是假设 typedef 是重要的问题的一部分。它不是。重要的是它的行为是否像一个对象。 Objective-C 是一种主要是鸭子类型的语言。如果它的行为像一个对象,那么它就是一个对象。

顺便说一句,NSProxy 也生活在这个奇怪的几乎是一个对象的世界中。如果你注意到它的定义,它不会继承任何东西,但它确实声明了一个 isa 字段作为它的第一个 ivar。这是让它表现得像一个对象的关键部分。

Can struct objc_class * and struct objc_object * really be used interchangeably?

没有。您通常可以将类传递给任何需要对象的对象(因为类是对象),但不能将对象传递给需要类的对象。

关于iOS/Objective-C - struct objc_class * 和 struct objc_object *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874458/

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