Objective c ‘;NSAutoreleasePool’;可能不响应‘-排水管’;在Ubuntu上

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; } 以下是

我试图在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;
}
以下是执行结果:

$ ./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,我建议您不要使用它,原因有几个

  • Objective-C是一种有趣的编程语言,具有许多强大的功能,但与其他面向对象语言相比(就其本身而言)并不明显更强大。当您将Objective-C与Cocoa和其他相关框架中的酷特性相结合时,它确实变得引人注目。苹果(主要)驱动这些框架,并且仅适用于Mac/iPhone
  • 苹果通常拥有Objective-C开发的最佳工具和用户体验。他们还大量投资于gcc的开发和替代。这将(一个已经做过的)使gcc没有设计的一些非常酷的东西成为可能
  • GNUstep是一个令人钦佩的项目,但由于它依赖于志愿者和苹果添加的反向工程新功能,因此它总是落后于最先进的技术。全新闪亮的Objective-C功能总是从苹果开始,并且(通常)最终会慢慢发展
  • 构建跨平台应用程序可以用Objective-C完成,但其他语言更适合这项任务。(与其说我是一个粉丝,还不如说Objective-C是解决所有问题的最佳方案。使用你手头最好的工具。)
  • 我并不是说在他们的“本地平台”以外的地方使用语言是不好的。我只是建议,如果你打算这么做,你应该意识到潜在的问题,并确信利大于弊

    int main(int argc, const char *argv[])
    {
        NSAutoreleasePool *pool;
        AppController *delegate;
    
        pool = [[NSAutoreleasePool alloc] init];
        // ...
        [pool release];
        return NSApplicationMain (argc, argv);
    }