8

我想在没有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 +alloc...autorelease called without pool

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

4

3 回答 3

9

alloc在不使用from Foundation的情况下创建新对象非常简单。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;
}

像往常一样编译它:

gcc Foo.m -o Foo -lobjc

就这样!

于 2013-03-24T00:06:17.670 回答
1

你可以在没有 Foundation 的情况下编写 Objective C,但当然你最终可能会在某种程度上重新发明轮子。

正如 millimoose 所建议的,您可以使用GNUStep Objective C runtime

有关详细信息,请参阅:

于 2013-03-23T22:59:04.847 回答
0

您没有定义 alloc,因为您没有从作为基础的 NSObject 继承。

这里有两种情况:

  1. 你认为这个基础是邪恶的,或者由于某种原因你不能使用它。
  2. 你这样做是为了锻炼。

如果您不是第二种情况,也不是某些使基础无法使用的特殊情况,我会重新考虑您的选择。

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

于 2013-03-23T23:07:07.237 回答