Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C类是如何实现的?_Objective C - Fatal编程技术网

Objective-C类是如何实现的?

Objective-C类是如何实现的?,objective-c,Objective C,我一直听说Objective-C类就是C结构。有人能更清楚地说明它们是如何实际实现的吗?Objective-C类实际上是一个对象本身 这是一篇关于这个主题的不错的文章:Objective-C类实际上是一个对象本身 这是一篇关于这个主题的不错的文章:直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了 因此,在结构中,您将有: isa指针,指向元类 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大

我一直听说Objective-C类就是C结构。有人能更清楚地说明它们是如何实际实现的吗?

Objective-C类实际上是一个对象本身


这是一篇关于这个主题的不错的文章:

Objective-C类实际上是一个对象本身


这是一篇关于这个主题的不错的文章:

直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了

因此,在结构中,您将有:

  • isa
    指针,指向元类
  • 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大小被存储并适当地添加在一起);及
  • 所有直接实例变量的类结构字段
在运行时的其他地方,也将至少有以下映射:

  • 每个支持的选择器的方法
    IMP
    元素的元类
  • 实例存储所有动态属性
  • 关联对象的实例;及
  • 也可能是从实例到它的任何
    引用
此外,还有一个用于retain计数的哈希映射。仅当retain计数高于
1
时,才会存储retain计数-暗示第一次retain


其中一个例外是标记指针。64位运行时允许将非常小的对象完全填充到指针中。因此,指针是存储对象;运行时可以发现真实指针和隐藏为对象的指针之间的差异,因为有效指针具有对齐要求。

直接实例变量的存储看起来很像C结构;经典地说,它就是一个,你可以直接操作结构而不是对象。那已经被移除了

因此,在结构中,您将有:

  • isa
    指针,指向元类
  • 分配对象内到该元类结构成员开头的偏移量记录(这就是如何避免脆弱基类问题的方法-在加载应用程序时,大小被存储并适当地添加在一起);及
  • 所有直接实例变量的类结构字段
在运行时的其他地方,也将至少有以下映射:

  • 每个支持的选择器的方法
    IMP
    元素的元类
  • 实例存储所有动态属性
  • 关联对象的实例;及
  • 也可能是从实例到它的任何
    引用
此外,还有一个用于retain计数的哈希映射。仅当retain计数高于
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