13

当我阅读新的 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: -- 中止”

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

此外,在没有 Foundation 或 AppKit 的情况下进行编译时,我会因为缺少符号而收到错误,尤其是 __objc_empty_vtable 和 __objc_empty_cache。我试过从 /usr/include/objc/ 中包含几个头文件

提前致谢。

更新

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

4

1 回答 1

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
于 2010-08-26T11:46:40.427 回答