关于结构的基本问题

时间:2011-05-18 02:21:30

标签: objective-c struct language-implementation

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变量,告诉它它是一个实例的类。

怎么能告诉????请引导我完成此代码的含义。

谢谢。

2 个答案:

答案 0 :(得分: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个已键入的对象,但您会将其转换为struct A,以便您可以访问它们。

IE:

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

    a    = ( struct A * )someObject;
    a->x = 42;
}

答案 1 :(得分:0)

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

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

我希望这可以解决您的问题,如果不是我可以帮助澄清