繁体   English   中英

Objective-C 2.0中的类对象是什么?

[英]What is a class object in Objective-C 2.0?

在2009年发布的名为Apple 的Objective-C 2.0编程语言的 Objective C 2.0的官方文档中,有一个关于类对象的段落在第28页。

我不明白Class Objects是什么,以及如何定义它们除了语言的其余部分以及它们具有什么属性。 在同一文档中,它解释了Objective-C 2.0中的所有内容都是一个对象,该对象基本上是一个指向包含isa字段的struct的指针,而指针本身的类型为id 由此我推断:

  • Obj-C 2.0中的继承主要包括通过idisa字段链接这些struct
    • 超类的对象以指向nil对象的方式构造isa字段。
  • id是Objective C 2.0中几乎所有内容的有效数据类型
  • 在定义类时,定义类本身的所有内容(方法和变量)都是从isa指针的下方/下方开始打包的

假设我得到了Objective C 2.0的工作原理,什么是类对象,它与实例的创建方式有何不同? 类对象提供的实例没有什么类型的属性? 你可以与C或C ++并行吗?

好的,所以你定义一个类。 我们叫他查理:

@interface Charlie : NSObject
@end

这是我们的小课! 因为 - 就像Obective-C中的其他每个类一样 - 查理是一个对象,你可以像[Charlie alloc]查理分配[Charlie alloc]那样发送消息让Charlie为你分配一个实例。 这就是我们对类对象的意思:它是表示您定义的类的对象。

Objective-C中的对象是什么? 类是基于这个结构定义的:

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

并且类由以下结构表示:

struct objc_class {         
    struct objc_class *isa; 
    struct objc_class *super_class; 
    // A bunch of other members …
}

正如你所看到的,两者都以isa引用一个类开头。 所以类只是普通对象的扩展。

当Charlie创建一个实例时,该实例的isa将指向Charlie。 不过查理的什么呢isa点? 嗯,它指向一个元类。 元类是一个奇怪的东西 - 它是一种特殊的类,只是作为一个类的类而存在。 你永远不会直接与它互动; 当你与其唯一的实例Charlie进行互动时,它只是履行其合理的职责†。

这就是我们谈论类对象时的意思 - 它只是表示您在代码中定义的类的对象。

†你可能想知道班级的职责是什么。 嗯,显而易见的是,这就是你创建对象的方式。 但除此之外,Objective-C中的实例并不拥有自己的方法。 相反,方法解析是基于对象的isa ,因此除了为您创建实例之外,类最重要的功能是确定对象具有哪些方法。

什么是类对象以及它与实例的创建方式有何不同? 类对象提供的实例没有哪些属性? 你可以与C或C ++并行吗?

让我们尝试与C和C ++进行比较。 首先,没有与C的比较,因为C不是面向对象的,因此对象的概念不存在。 在C ++中,您拥有在.h文件中声明的类(或对象),在那里编写类的定义(名称,实例变量,方法或函数),然后在.cpp文件中实现定义中声明的方法。
同样在C ++中,您可以拥有静态变量和方法,正如您可能知道的那样,它们不属于该类的特定实例,我们可以说它们会影响所有实例

在目标C中, 类属性类方法类似于C ++中的静态变量静态函数

类对象是Objective C 封装类定义并使其在运行时可用的方式。 您不一定明确地实例化类对象。

考虑这个课程

@interface MyObject : NSObject
{
    int i;
}
- (void)myFunction;
+ (void)classFunction;
@end

您可以使用以下方法实例化此类对象:

MyObject *obj = [[MyObject alloc] init];

在这里,您将使用MyObject 类对象alloc方法。 要理解的重要一点是,您没有实例化类对象,编译器只创建一个对象,一个类对象,来表示类。

Object是一个结构,有isa指向其Class的字段。 isa允许结构接收Objective-C消息,这使它成为一个Object。 isa指向的类用于查找这些消息的实现。

(有趣的是,块也是对象,GCD结构也是。它们都可以接收消息,例如-copy用于块或-description用于dispatch_queue 。)

是用于查找其实例的方法的结构。 它有一个实例的方法实现列表( -methods )。 类具有isa字段,因此它们可以作为对象限定,因此也可以接收消息。 类的isa指向元类,因此类是元类的实例。 它的单个实例 - 单身。

Metaclass是我迷路的地方,但它肯定是一个对象,因为它有isa Metaclass有一个单个实例的方法实现( +methods )列表--Class。

当你编写这段代码时:

@interface MYObject : NSObject
+ (void)classMethod; // Stored in Metaclass
- (void)instanceMethod; // Stored in Class
@end

您正在创建一对:Class和Metaclass

哦,什么是元类? 根元类!
什么是根元类的一类? Root Metaclass本身!
但那么Metaclasses的isa指向哪里? 给我们的老朋友NSObject 元了 ,对吧?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM