3

当我尝试编译这段代码时,我用 gcc在这里得到了表格:

#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

我做错了什么?

环境:linux-x86_64,gcc-4.7.2

谢谢。

4

1 回答 1

3

那个代码是错误的。又古。它永远不会奏效。现在它应该有(修复并添加了一些额外的例子)。

首先,检查您是否安装了 GNUStep。如果这样做,请切换到使用 NSObject 和 libFoundation (实际上libgnustep-base,正如 Fred 在评论中指出的那样)。

init其次,当 Object 仍然是根类时,[IIRC - 在此处刮擦旧脑细胞]仍然返回 (id)。由于您在该init方法中没有做任何有用的事情,因此只需将其完全删除。

编译器错误表明您的Hello子类没有正确地继承自Object,这是没有意义的。

于 2013-01-19T00:30:12.320 回答