2010-08-11 29 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