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

时间:2014-02-28 20:36:37

标签: objective-c

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

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

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

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

3 个答案:

答案 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。太,对吧?