2010-08-11 30 views
13

当我在阅读关于新的4.0.2 iOS更新时,我想知道黑客做什么或尝试用缓冲区溢出做什么,在一些维基百科之后,我有兴趣玩malloc,从而创建我自己的“NSObject”。从零开始重新实现NSObject

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

当然,正如我所料,我遇到了一些我无法解决的问题。

创建我的对象我这样做:

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

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

致电时[TestObject的创建]。我收到以下控制台消息:

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

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

另外,当编译没有Foundation或AppKit时,我得到一个错误的符号, __objc_empty_vtable和__objc_empty_cache特别是。 我试过包括几个头文件从/ usr/include/objc/

在此先感谢。

更新

与libobjc链接之后试图调用从我的类中的方法当我收到EXC_BAD_INSTRUCTION。

+0

你可能想看看NSObject协议,如果您尚未:http://developer.apple。 com/mac/library/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html – Justin 2010-08-11 22:08:03

+0

包含头文件不会解决来自链接器的丢失符号错误。您需要链接到libobjc(通常由Foundation完成)。 – 2010-08-12 08:42:30

+3

反正你可能不想使用sizeof(self)来获得大小。 'self'是一个指针,所以你只需要获得指针的大小。您可以使用'class_getInstanceSize'来代替。 – David 2010-08-12 11:49:03

回答

9

正如David指出的那样,您需要使用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