如何在没有Foundation的情况下分配新对象?

时间:2013-03-23 22:56:17

标签: objective-c objective-c-runtime

我想构建一个没有Foundation的简单Objective C程序。我试过了:

#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 ...

如何在不使用Foundation的alloc的情况下初始化对象?

3 个答案:

答案 0 :(得分: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

这就是全部!

答案 1 :(得分:1)

答案 2 :(得分:0)

您没有定义alloc,因为您不从NSObject继承,而NSObject是基础的一部分。

这里的案例有两个:

  1. 你认为基础是邪恶的,或者由于某种原因你不能使用它。
  2. 你正在锻炼身体。
  3. 如果你不属于第二种情况,并且在某些特殊情况下也不能使用粉底,我会重新考虑你的选择。

    但是如果你不想使用基础,那么alloc应该返回一个初始化了isa指针的对象。