Objective-C类是如何实现的?
我一直听说Objective-C类就是C结构。有人能更清楚地说明它们是如何实际实现的吗?Objective-C类实际上是一个对象本身Objective-C类是如何实现的?,objective-c,Objective C,我一直听说Objective-C类就是C结构。有人能更清楚地说明它们是如何实际实现的吗?Objective-C类实际上是一个对象本身 这是一篇关于这个主题的不错的文章:Objective-C类实际上是一个对象本身 这是一篇关于这个主题的不错的文章:直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了 因此,在结构中,您将有: isa指针,指向元类 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大
这是一篇关于这个主题的不错的文章:Objective-C类实际上是一个对象本身
这是一篇关于这个主题的不错的文章:直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了 因此,在结构中,您将有:
指针,指向元类李>isa
- 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大小被存储并适当地添加在一起);及
- 所有直接实例变量的类结构字段
- 每个支持的选择器的方法
元素的元类李>IMP
- 实例存储所有动态属性李>
- 关联对象的实例;及
- 也可能是从实例到它的任何
弱
引用
1
时,才会存储retain计数-暗示第一次retain
其中一个例外是标记指针。64位运行时允许将非常小的对象完全填充到指针中。因此,指针是存储对象;运行时可以发现真实指针和隐藏为对象的指针之间的差异,因为有效指针具有对齐要求。直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了 因此,在结构中,您将有:
指针,指向元类李>isa
- 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大小被存储并适当地添加在一起);及
- 所有直接实例变量的类结构字段
- 每个支持的选择器的方法
元素的元类李>IMP
- 实例存储所有动态属性李>
- 关联对象的实例;及
- 也可能是从实例到它的任何
弱
引用
1
时,才会存储retain计数-暗示第一次retain
其中一个例外是标记指针。64位运行时允许将非常小的对象完全填充到指针中。因此,指针是存储对象;运行时可以发现真实指针和隐藏为对象的指针之间的差异,因为有效指针具有对齐要求
我一直听说Objective-C类就是C结构
让我们先谈谈对象
对象不仅仅是结构。它们是具有特定布局的结构,Objective-C编译器和运行时可以理解这些布局。运行时提供了一组实现消息传递等功能的C函数。编译器将Objective-C语法转换为对这些运行时函数的调用。下面是Objective-C的一个片段:
[foo bar:baz];
可能会转换为等效的C代码:
objc_msgSend(foo, sel_bar, baz);
其中,sel\u bar
是对应于bar:
的选择器foo
是指向对象的指针,即以下形式的结构:
struct objc_object {
Class isa;
};
在该结构的顶部可能会有其他实例变量,因此foo
处的结构可能看起来像:
struct objc_object {
Class isa;
int a;
float b;
id c;
};
但要成为运行时可以使用的对象,结构实际上只需要一个isa
指针作为其第一个成员。这指向一个class对象,该对象定义foo
所属的类
现在,类也是一个对象——也就是说,它是一个以isa
指针开头的结构。但是类有额外的字段,包括超类、类名、实例变量列表、方法列表等等。您可以在中看到实际的定义。请参阅,以查看对类进行操作的函数列表,从而更好地了解运行时如何操作该结构
关于Objective-C如何从结构中创建对象,还有很多需要了解的,但Apple提供了一个完整的文档来解释它,所以我只让您参考
我一直听说Objective-C类就是C结构
让我们先谈谈对象
对象不仅仅是结构。它们是具有特定布局的结构,Objective-C编译器和运行时可以理解这些布局。运行时提供了一组实现消息传递等功能的C函数。编译器将Objective-C语法转换为对这些运行时函数的调用。下面是Objective-C的一个片段:
[foo bar:baz];
可能会转换为等效的C代码:
objc_msgSend(foo, sel_bar, baz);
其中,sel\u bar
是对应于bar:
的选择器foo
是指向对象的指针,即以下形式的结构:
struct objc_object {
Class isa;
};
在该结构的顶部可能会有其他实例变量,因此foo
处的结构可能看起来像:
struct objc_object {
Class isa;
int a;
float b;
id c;
};
但要成为运行时可以使用的对象,结构实际上只需要一个isa
指针作为它的f