从头开始重新实现NSObject

时间:2010-08-11 21:51:09

标签: objective-c cocoa cocoa-touch macos nsobject

当我阅读有关新的4.0.2 iOS更新时,我想知道黑客做了什么或尝试使用缓冲区溢出,这在一些维基百科之后让我对使用malloc感兴趣并因此创建了我自己的“NSObject” ”

我实际上并不打算在我的任何应用程序中使用它,它只用于学习和使用objective-c。

当然,正如预期的那样,我遇到了一些我无法解决的问题。

用于创建我的对象:

+ (id)create{ return malloc(sizeof(self)); }

- (void)free { free(self); }

调用[TestObject create]时;我收到以下控制台消息:

“8/11/10 11:17:31 PM TestingHeap [2675] *** NSInvocation:警告:类'AObject'的对象0x100002100未实现doesNotRecognizeSelector: - abort”

所以它试图将我的对象作为NSObject处理..?以及如何解决这个问题。

在没有Foundation或AppKit的情况下进行编译时,我会收到错误符号的错误, 特别是__objc_empty_vtable和__objc_empty_cache。 我尝试过包含/ usr / include / objc /

中的几个头文件

提前致谢。

更新

在与libobjc链接后,我尝试从我的班级调用方法时收到EXC_BAD_INSTRUCTION。

1 个答案:

答案 0 :(得分:9)

大卫指出,您需要使用class_getInstanceSize代替sizeof

您需要链接libobjc(正如您自己发现的那样)。

您的基类需要isa指针,该指针必须在create方法中设置。

运行时需要实现+initialize方法,该方法将在第一次使用类之前调用​​。如果它丢失,它会崩溃。

所以基类的所有东西至少应该包含这个:

#include <objc/objc.h>
#include <objc/runtime.h>
#include <stdlib.h>

@interface MyBase {
    Class isa;
}

+ (id) alloc;
- (void) free;

@end

@implementation MyBase

+ (void) initialize;
{
}

+ (id) alloc;
{
        size_t size = class_getInstanceSize( self );
        MyBase *result = malloc( size  );
        result->isa = self;
        return result;
}

- (void) free;
{
        free( self );
}

@end