理解ObjectC中的类

时间:2010-06-29 08:58:55

标签: objective-c class

在objc.h中,有类

的定义
typedef struct objc_class *Class;

typedef struct objc_object {

  Class isa;
} *id;

案例:在NSObject中使用Class:

/*************** Basic protocols  ***************/

@protocol NSObject

- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;

- (Class)superclass;
- (Class)class;
- (id)self;

很难理解,所以Class只是结构,而不是像NSObject等真正的类。

班级的真正目的是什么?

4 个答案:

答案 0 :(得分:0)

我认为你走错了路。

头文件应该像这样:

#import <Foundation/NSObject.h>

@interface Fraction: NSObject {
    int numerator;
}

-(void) print;
@end

这样的实现(.m文件)

#import "Fraction.h"
#import <stdio.h>

@implementation Fraction
-(void) print {
    printf( "%i", numerator );
}
@end

source

问候

答案 1 :(得分:0)

在Objective-C中,类是“first-class objects”。它们在运行时类型检查中至关重要,例如检查一个对象是否是一个可以使用的字符串

[obj isKindOfClass:[NSString class]];

-isKindOfClass:需要接受一个Objective-C类作为参数,Class是它的表示。

(除非您需要在C API级别下操作Objective-C运行时,否则很少需要关注objc.h中的类型定义。)

答案 2 :(得分:0)

Class让Objective-C运行时系统知道在哪里查找方法表(和实例变量等)。特别是,当你写

[self foo: bar];

运行时系统调用

objc_msgSend(self, @selector(foo:), bar);

然后它使用self的类型来查找正确的类,以找到适当的方法表来查找与foo:消息对应的实现。然后运行它。

答案 3 :(得分:0)

由于Class类,Objective-C运行时的所有动态行为都可用。它不是您将要子类或实现的类。运行时填充有关您的类的元数据,可以访问该元数据以进行内省或修改。

像C ++甚至Java这样的语言对这类事情的支持非常有限。在这方面,Objective-C更接近Ruby或Python脚本语言。实际上,您可以在运行时使用自己的实现替换现有类中的实例方法,并以大多数编译语言无法触及的其他方式影响类。