在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等真正的类。
班级的真正目的是什么?
答案 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
问候
答案 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脚本语言。实际上,您可以在运行时使用自己的实现替换现有类中的实例方法,并以大多数编译语言无法触及的其他方式影响类。