Objective c ‘;NSAutoreleasePool’;可能不响应‘-排水管’;在Ubuntu上
我试图在Ubuntu Hardy上编译以下Objective-C程序,但由于某些原因,我收到了警告Objective c ‘;NSAutoreleasePool’;可能不响应‘-排水管’;在Ubuntu上,objective-c,ubuntu,gnustep,Objective C,Ubuntu,Gnustep,我试图在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; } 以下是
#import <Foundation/Foundation.h>
int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog (@"Hello");
[pool drain];
return 0;
}
以下是执行结果:
$ ./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
如何解决此问题?听起来GNUStep中的类库已经过时,至少在您使用的版本中是这样的--[NSAutoreleasePool drain]是在OS X 10.4 IIRC中添加的。但我对GNUStep一无所知,所以我不知道是否有更新的库可用
您可以通过将“排放”替换为“释放”来解决此问题。他们做的基本相同;添加了“drain”方法以在垃圾收集应用程序中使用,因为“release”在该环境中成为no-op。在我的应用程序主循环中使用GNUStep:
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool;
AppController *delegate;
pool = [[NSAutoreleasePool alloc] init];
// ...
[pool release];
return NSApplicationMain (argc, argv);
}
首先,简单的答案是:使用
-release
。我相信-drain
是在10.4中作为-release
的别名添加的,并且在10.5中它获得了自己特定于GC的行为。这允许代码在10.5中使用它,并且仍然在10.4下工作。GNUstep可能还没有新的功能
显然,你正在Ubuntu上试用一些样板Objective-C代码,但这让我想知道你希望在长期内完成什么。如果只是出于好奇或是为了挑战,请不要让我阻止你。然而,如果您计划使用GNUstep为严肃的编程开发Objective-C,我建议您不要使用它,原因有几个
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool;
AppController *delegate;
pool = [[NSAutoreleasePool alloc] init];
// ...
[pool release];
return NSApplicationMain (argc, argv);
}