从头开始重新实现NSObject

Ant*_*udt 13 macos cocoa cocoa-touch objective-c nsobject

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

我实际上并没有计划在我的任何应用程序中使用它,它只用于学习和使用objective-c.

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

为了创建我的对象我做:

+ (id)create{ return malloc(sizeof(self)); }
Run Code Online (Sandbox Code Playgroud)

和

- (void)free { free(self); }
Run Code Online (Sandbox Code Playgroud)

调用[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.

Sve*_*ven 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
Run Code Online (Sandbox Code Playgroud)