2013-03-23 66 views
6

我想構建一個沒有Foundation的簡單Objective C程序。我想:如何在沒有Foundation的情況下分配一個新對象?

#include <stdio.h> 

@interface Foo{ 
    char * bar; 
} 
-(void)hello; 
@end 

@implementation Foo 
-(void)hello { 
    printf("Hello world!"); 
} 
@end 

int main(){ 
    Foo * foo = [Foo alloc]; 
    return 0; 
} 

然後它告訴我Foo may not respond to +allocautorelease called without pool ...

我如何初始化一個對象,而無需使用alloc從基金會?

+2

爲什麼你想避免使用基金會? – occulus 2013-03-23 22:57:19

+0

@occulus因爲我想使用Objective C作爲C++的替代品,所以我沒有運行Mac OS – texasbruce 2013-03-23 22:58:20

+2

@texasbruce然後使用GNUStep的運行時。 (不完全是平臺的實際選擇,但它會比嘗試重新創建'NSObject'更好。) – millimoose 2013-03-23 22:58:46

回答

9

創建新對象非常簡單,無需使用Foundation的alloc。 Objective-C運行時庫本身提供的函數允許從類中分配對象並在稍後解除對象分配,因此不需要額外的庫來創建和銷燬對象。

函數id class_createInstance(Class cls, size_t extraBytes)接收一個用於分配新對象的類對象和一個幾乎總是爲零的整數,並返回一個新的cls實例。

同樣,函數id object_dispose(id obj)需要一個Objective-C對象,調用每個C++對象實例變量的C++析構函數,刪除現有的相關引用並將其釋放。

class_createInstanceobject_dispose均在/usr/include/objc/runtime.h中聲明。

因此,您可以實施自己的+alloc-dealloc方法。你的程序是這樣的:

#include <stdio.h> 
#include <objc/runtime.h> 

@interface Foo{ 
    char * bar; 
} 
+(id)alloc; 
-(void)hello; 
@end 

@implementation Foo 
+(id)alloc { 
    // Returns a new 'Foo' object. In this case, 'self' is a 'Foo' class object, 
    // whose type is 'Class', as required by `class_createInstance`. 
    return class_createInstance(self, 0); 
} 
-(void)dealloc { 
    object_dispose(self); 
} 
-(void)hello { 
    printf("Hello world!"); 
} 
@end 

int main(){ 
    Foo *foo = [Foo alloc]; 
    [foo hello]; 
    [foo dealloc]; 

    return 0; 
} 

編譯它與平時一樣:

gcc Foo.m -o Foo -lobjc 

這一切!

+0

我查看了runtime.h,發現:要銷燬一個對象,使用'object_dispose(obj)'來防止任何人詢問。 – texasbruce 2013-03-25 02:21:15

+0

記得很好,@texasbruce。 – LuisABOL 2013-03-25 16:49:06

1
+0

我用'Object.h'嘗試了第一個,但它仍然告訴我alloc方法沒有被定義...我想我必須使用NSObject然後 – texasbruce 2013-03-23 23:23:07

0

你不定義頁頭,因爲你不從NSObject的繼承這是基礎的一部分。

這裏的情況有兩種:

  1. 您認爲基礎是邪惡的,或者由於某些原因,你不能使用它。
  2. 你在做這個練習。

如果您不是第二種情況,也不是在某些特殊情況下無法使用基礎,我會重新考慮您的選擇。

但是,如果你不想使用基礎,alloc應該返回一個isa指針初始化的對象。

+0

還要確保你已經照顧了標記指針和小對象自定義分配。最好使用你的運行時給你的東西。對象必須暴露或擁有isa。 – 2013-03-26 22:08:59

相關問題