当我阅读有关新的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。
答案 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