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变量,告诉它它是一个实例的类。
怎么能告诉????请引导我完成此代码的含义。
谢谢。
答案 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。
我希望这可以解决您的问题,如果不是我可以帮助澄清