在2009年发布的Apple的 Objective C 2.0 标题为 Objective-C 2.0编程语言的官方文档中,有一个关于类对象的段落,第28页
我不明白Class Objects是什么,以及除了语言的其余部分以及它们具有什么属性之外如何定义它们。在同一文档中,它解释了Objective-C 2.0中的所有内容都是一个对象,该对象基本上是指向struct
的指针,该isa
包含id
字段,指针本身的类型为struct
}。
从中我推断出:
id
链接到isa
和isa
字段
nil
对象的方式构造id
字段。isa
是Objective C 2.0中几乎所有内容的有效数据类型假设我了解了Objective C 2.0的工作原理,什么是类对象,它与实例的创建方式有何不同?类对象提供的实例没有什么类型的属性?你可以与C或C ++并行吗?
答案 0 :(得分:4)
好的,所以你定义了一个类。我们叫他查理:</ p>
@interface Charlie : NSObject
@end
这是我们的小课!因为 - 就像Obective-C中的其他每个类一样 - 查理是一个对象,你可以发送像[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
完成的,因此除了为您创建实例之外,类最重要的功能是确定对象具有哪些方法。
答案 1 :(得分:2)
什么是类对象以及它与实例的方式有何不同 被创造了吗?类对象提供什么样的属性 实例没有?你可以与C或C ++并行吗?
让我们尝试与C和C ++进行比较。首先,没有与C的比较,因为C不是面向对象的,因此对象或类的概念不存在。在C ++中,您有在 .h 文件中声明的类(或对象),在那里编写类的定义(名称,实例变量,方法或函数),然后在你的 .cpp 文件实现了定义中声明的方法 同样在C ++中,您可以拥有静态变量和方法,正如您可能知道的那样,它们不属于该类的特定实例,我们可以说它们会影响所有实例
在目标C中,类属性或类方法类似于静态变量和静态函数在C ++中。
类对象是目标C 封装类的定义并使其在运行时可用的方式。您不必显式实例化类对象。
考虑这个课程
@interface MyObject : NSObject
{
int i;
}
- (void)myFunction;
+ (void)classFunction;
@end
您可以使用以下方法实例化此类对象:
MyObject *obj = [[MyObject alloc] init];
您正在使用alloc
类对象的MyObject
方法。要理解的重要一点是,您没有实例化类对象,编译器只创建一个对象,一个类对象,来表示类。
答案 2 :(得分:1)
对象是一种结构,其isa
字段指向其类。这个isa
允许结构接收Objective-C消息,这使它成为一个Object。 isa
指向的类用于查找这些消息的实现。
(有趣的是,块也是对象,GCD结构也是。它们都可以接收消息,例如-copy
用于块,或-description
用于dispatch_queue
。)
类是用于查找其实例方法的结构。它有一个实例的方法实现列表(-methods
)。类具有isa
字段,因此它们符合对象的条件,因此也可以接收消息。 Class的isa
指向Metaclass,因此Class是Metaclass的实例。它的单个实例 - 单身。
元类是我迷路的地方,但它绝对是一个对象,因为它有isa
。 Metaclass有一个单个实例的方法实现列表(+methods
) - Class。
编写此代码时:
@interface MYObject : NSObject
+ (void)classMethod; // Stored in Metaclass
- (void)instanceMethod; // Stored in Class
@end
您正在创建对:Class和Metaclass 。
哦,什么是元类?根元类!
什么是Root Metaclass? Root Metaclass本身!
但那时Metaclasses的isa
指向哪里?致我们的老朋友NSObject
。太元,对吧?