[英]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
。 由此我推断:
id
和isa
字段链接这些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.