2013-03-23 62 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

相关问题