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

tex*_*uce 6 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;
}
Run Code Online (Sandbox Code Playgroud)

然后它告诉我Foo may not respond to +allocautorelease called without pool...

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

Lui*_*BOL 9

在不使用allocFoundation的情况下创建新对象非常简单.Objective-C运行时库本身提供的功能允许用户从类中分配对象并在以后解除分配,因此您无需额外的库来创建和销毁对象.

该函数id class_createInstance(Class cls, size_t extraBytes)接收一个类对象,从该对象分配一个新对象,以及一个几乎总是为零的整数,并返回一个新的实例cls.

类似地,该函数id object_dispose(id obj)采用Objective-C对象,调用每个C++对象实例变量的C++析构函数,删除现有的关联引用并释放它.

class_createInstance并且object_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;
}
Run Code Online (Sandbox Code Playgroud)

像往常一样编译它:

gcc Foo.m -o Foo -lobjc
Run Code Online (Sandbox Code Playgroud)

就这样!