从头开始编写Objective-C类

ryy*_*yst 12 objective-c

我想写一个没有Cocoa或GNU的Objective-C类Object.h(用于教育目的).我在网上挖掘,在我看来,很多人希望"随语言而来"的东西,比如类和消息发送,实际上是在第三方编写的文件中定义的,例如objc-runtime.h.

有没有什么任何文档真的纯Objective-C和什么是运行时/框架的组成部分?我需要实现哪些功能才能在不使用任何第三方代码的情况下获得工作环境(Object.h或者objc-runtime.h再次注意这是出于教育目的,而不是用于生产代码)?

感谢您的任何见解!

Jon*_*pan 5

真的,如果你没有继承,唯一必须照顾好自己的NSObject是对象的创造和破坏; 无论其父类如何,否则方法的行为方式相同.像KVC和内存管理这样的功能是OpenStep/Cocoa的功能,但不是语言的一部分.

这是一个从头开始的课程:

@interface MyClass { // note the lack of a superclass here
    @private Class isa;
}
+ (MyClass *)create;
- (void)destroy;

- (int)randomNumber;
@end


@implementation MyClass
+ (MyClass *)create {
    return class_createInstance(self, 0);
}

- (void)destroy {
    object_dispose(self);
}

- (int)randomNumber {
    return rand();
}
@end
Run Code Online (Sandbox Code Playgroud)

以下是它的使用方法:

int main(int argc, char **argv) {
    MyClass *foo = [MyClass create];
    if (foo) {
        printf("random! %i\n", [foo randomNumber]);
        [foo destroy];
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果你甚至不想使用class_createInstance()object_dispose(),你必须手动实现等价物,以及相当于class_getInstanceSize()你知道对象占用多少内存.但即使你管理它,也不要认为你已经逃脱了Objective-C运行时!消息调度仍完全基于运行时中的C函数构建,并且Objective-C语法在编译期间转换为对这些函数的调用.