当我尝试编译此代码时,我使用gcc:
形式here#import <stdio.h>
#import <objc/Object.h>
@interface Hello: Object
- (void) init;
- (void) say;
@end
@implementation Hello
- (void) init {
[super init];
}
- (void) say {
printf("Hello, world!\n");
}
@end
int main() {
Hello *hello = [Hello new];
[hello say];
[hello free];
return 0;
}
带有命令行的:g ++ -x objective-c ++ test.mm -otest -lobjc
编译时,我收到以下警告:
test.mm:11:14: warning: ‘Object’ may not respond to ‘-init’ [enabled by default]
test.mm:11:14: warning: (Messages without a matching method signature
[enabled by default]
test.mm:11:14: warning: will be assumed to return ‘id’ and accept
[enabled by default]
test.mm:11:14: warning: ‘...’ as arguments.) [enabled by default]
test.mm: In function ‘int main()’:
test.mm:19:28: warning: ‘Hello’ may not respond to ‘+new’ [enabled by default]
test.mm:21:14: warning: ‘Hello’ may not respond to ‘-free’ [enabled by default]
如果我试图跑 - 我得到SIGSEGV:
$> ./test
$> Segmentation fault
我做错了什么?
env:linux-x86_64,gcc-4.7.2
感谢。
答案 0 :(得分:3)
那段代码错了。而古老的。它永远不会奏效。现在它将(修复并添加一些其他示例)。
首先,检查您是否安装了GNUStep。如果这样做,请切换到使用NSObject和libFoundation(实际上libgnustep-base
,正如Fred在评论中指出的那样)。
其次,[IIRC - 在这里抓旧脑细胞]当对象仍然是根类时init
仍然返回(id)。由于您在init
方法中没有做任何有用的事情,只需将其完全删除即可。
编译器错误表明您的Hello
子类未正确继承Object
,这没有任何意义。