1
struct
{
int integer;
float real;
}
first_structure;

所以我们可以通过写来引用 first_structure 的成员

first_structure.integer = 7

如果我写:

    struct two_numbers
    {
    int integer;
    float real;
    }
    first_structure;

然后我可以使用标签 *two_numbers* 创建第二个结构,如下所示:

struct two_numbers second_structure;

我也明白 typedef 可以用来创建同义词。

但我无法理解下面的代码(来自页面http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html):

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

因此,每个对象都有一个 isa 变量,告诉它它是什么类的实例。

怎么能说????请指导我了解此代码的含义。

谢谢你。

4

2 回答 2

1

这是一个捷径:

struct objc_object
{
    Class isa;
};
typedef struct objc_object * id

id类型是指向结构的指针objc_object。因此,当使用id类型时,您将使用->运算符而不是.,因为它是一个指针。

请注意,该Class类型也是指向结构的指针。这称为不透明类型。

这基本上意味着编译器将能够计算大小,因为我们只有一个指针,但它不会知道实现细节。

这种模式用于隐藏结构的实际实现。类型在头文件中定义,但实现仅在源文件中定义。

例如,在头文件中:

typedef struct A_Struct * A;

这是有效的,它定义了结构指针的类型,即使该结构实际​​上是未知的。

然后在源文件中:

struct A
{
    int x;
    int y;
};

这是真正的实现。用户将能够创建A类型化的对象,但不能访问成员,因为它们仅在您的源文件中是已知的。用户将向您传递A键入的对象,但您会将它们强制转换为 a struct A,因此您可以访问它的成员。

IE:

void foo( A someObject )
{
    struct A * a;

    a    = ( struct A * )someObject;
    a->x = 42;
}
于 2011-05-18T02:34:29.667 回答
0

你可以看出,因为当一个对象被实例化时,运行时设置 isa 指针以反映类的名称。类似于如何使用objective-c 中的“选择器” - 如果您不熟悉,基本上选择器是方法的名称。在幕后它只是一个 NSString,但它不一定是(我相信替代实现 Cocotron 使用整数类型的枚举)。

基本上,运行时能够知道正在创建什么对象,因此可以设置 isa 指针。并且自省可以起作用,因为如果您将对象与“类”进行比较,您可能只是在比较幕后的 NSStrings。

我希望这能解决您的问题,如果没有,我可以帮助澄清

于 2011-05-18T02:33:54.260 回答