所以我有这段代码......
/**
* cdb.m
* Copyright (C) 2013 Naveen Mathew. All rights reserved.
*/
#import <objc/Object.h>
#import "cdb.h"
#import <stdio.h>
#import <stdlib.h>
@implementation CDB : Object
{
}
- (int) main {
printf("Hello world");
return 0;
}
@end
int main(void)
{
CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
[myNumber main];
return 0;
}
我想在Ubuntu 13.04中编译它,但没有GNUStep给我的所有废话。所以我使用GNU Objective C运行时(gobjc),但是当我编译时,我得到以下内容......
clang -Wall -lobjc -o cdb cdb.m -I/usr/lib/gcc/x86_64-linux-gnu/4.7/include
cdb.m:25:21: warning: class method '+new' not found (return type defaults to
'id') [-Wobjc-method-access]
CDB *myNumber = [CDB new]; // equal to [[Number alloc] init]
^ ~~~
1 warning generated.
当我运行该程序时,我得到一个分段错误...我正在使用gobjc 4.7。我尝试使用gobjc 4.6 ...它编译但我仍然遇到分段错误......
答案 0 :(得分:3)
我认为一些古老的运行时已经实现了+ new和friends。对于像gnustep-runtime这样的新运行时,包括一个与GCC非常不同的运行时,我认为,你必须使用类别或任何方式实现自己的掷骰子。你可以切断&amp;粘贴GNUstep的NSObject实现,但它可能对你来说太棘手,因为它会像使用retain counter等为malloc添加前缀,否则你可能想要实现自己的方式来维护引用计数,就像使用哈希映射或任何东西一样。你也可以尝试使用像ObjFW这样的替代框架,如果GNUstep-base本身就有太多的骰子。
答案 1 :(得分:2)
+(id)new是NSObject类的一个函数。但是,您是运行时对象的子类。要使用您习惯在OS X中使用的大多数Apple方法,您需要替代NSObject。
此外,您在接口中声明了对象的超类,而不是实现。您需要将@implementation CDB : NSObject
更改为@implementation CDB
,然后在您的标题文件中添加@interface CDB : NSObject { ...