我正在尝试在Ubuntu Hardy上编译以下Objective-C程序,但由于某些原因,我收到了警告。
#import <Foundation/Foundation.h>
int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog (@"Hello");
[pool drain];
return 0;
}
编译器的输出:
$ gcc `gnustep-config --objc-flags` -lgnustep-base objc.m
This is gnustep-make 2.0.2. Type 'make print-gnustep-make-help' for help.
Making all for tool LogTest...
Compiling file objc.m ...
objc.m: In function ‘main’:
objc.m:6: warning: ‘NSAutoreleasePool’ may not respond to ‘-drain’
objc.m:6: warning: (Messages without a matching method signature
objc.m:6: warning: will be assumed to return ‘id’ and accept
objc.m:6: warning: ‘...’ as arguments.)
Linking tool LogTest ...
以下是执行结果:
$ ./a.out
2009-06-28 21:38:00.063 a.out[13341] Hello
Aborted
我做完了:
apt-get install build-essential gnustep gobjc gnustep-make libgnustep-base-dev
如何解决此问题?
答案 0 :(得分:3)
听起来像GNUStep中的类库已经过时了,至少在您使用的版本中 - 在OS X 10.4 IIRC中添加了[NSAutoreleasePool drain]。我对GNUStep一无所知,所以我不知道是否有更新的库。
您可以通过将'drain'替换为'release'来解决此问题。他们做的基本相同;添加'drain'方法是为了在垃圾收集的应用程序中使用,因为'release'在该环境中变为无操作。
答案 1 :(得分:3)
首先,简单的答案是:使用-release
代替。我相信在{10.4}中添加了-drain
作为-release
的别名,在10.5中它获得了自己的GC特定行为。这允许代码在10.5中使用它并仍然在10.4下工作。 GNUstep可能还没有新的功能。
显然你正在Ubuntu上尝试一些样板代码的Objective-C代码,但它让我想知道你希望长期实现什么。如果只是出于好奇或挑战,请不要让我阻止你。但是,如果您计划使用GNUstep为严肃的编程开发Objective-C,我会建议您反对它,原因有几个。
我不是说在他们的“原生平台”以外的东西上使用语言是不好的。我只是在暗示,如果这就是你要做的事情,你应该意识到潜在的问题,并确保你确信优点超过了缺点。
答案 2 :(得分:1)
在我使用GNUStep的app主循环中:
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool;
AppController *delegate;
pool = [[NSAutoreleasePool alloc] init];
// ...
[pool release];
return NSApplicationMain (argc, argv);
}