我想构建一个没有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
...
如何在不使用Foundation的alloc
的情况下初始化对象?
答案 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_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
这就是全部!
答案 1 :(得分:1)
你可以在没有基础的情况下编写Objective C,但当然你可能会在某种程度上重新发明轮子。
正如millimoose建议的那样,您可以使用GNUStep Objective C runtime。
有关详细信息,请参阅:
答案 2 :(得分:0)
您没有定义alloc,因为您不从NSObject继承,而NSObject是基础的一部分。
这里的案例有两个:
如果你不属于第二种情况,并且在某些特殊情况下也不能使用粉底,我会重新考虑你的选择。
但是如果你不想使用基础,那么alloc应该返回一个初始化了isa指针的对象。