【问题标题】:‘NSAutoreleasePool’ may not respond to ‘-drain’ on Ubuntu“NSAutoreleasePool”可能不会响应 Ubuntu 上的“-drain”
【发布时间】:2009-06-29 04:47:22
【问题描述】:

我正在尝试在 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

我该如何解决这个问题?

【问题讨论】:

    标签: objective-c ubuntu gnustep


    【解决方案1】:

    首先,答案很简单:改用-release。我相信-drain 是在 10.4 中作为-release 的别名添加的,并且在 10.5 中它获得了自己的 GC 特定行为。这允许代码在 10.5 中使用它并且在 10.4 下仍然可以工作。 GNUstep 可能还没有新功能。


    很明显,您正在 Ubuntu 上尝试一些样板的 Objective-C 代码,但这让我想知道您希望长期完成什么。如果只是出于好奇或挑战,请不要让我阻止您。但是,如果您打算使用 GNUstep 开发 Objective-C 来进行严肃的编程,我建议您不要这样做,原因有几个。

    1. Objective-C 是一种有趣的编程语言,具有许多强大的功能,但(就其本身而言)并不比其他面向对象的语言更强大。当您将 Objective-C 与 Cocoa 和其他相关框架中的酷特性结合使用时,它确实变得引人注目。 Apple(主要)驱动这些框架,并且仅适用于 Mac/iPhone。
    2. Apple 通常拥有最佳的 Objective-C 开发工具和用户体验。他们还大力投资开发LLVMClang 作为gcc 的替代品。这将(已经做到)使 gcc 并非设计用于的一些非常酷的事情成为可能。
    3. GNUstep 是一个令人钦佩的项目,但由于它依赖于志愿者和对 Apple 添加的新功能进行逆向工程,它总是落后于最先进的技术。新的闪亮的 Objective-C 功能将始终从 Apple 开始,并且(通常)最终会逐渐渗透。
    4. 构建跨平台应用程序可以在 Objective-C 中完成,但其他语言更适合这项任务。 (我不太喜欢建议 Objective-C 是解决所有问题的最佳解决方案。使用手头最好的工具。)

    我并不是说在“原生平台”之外的其他平台上使用语言是不好的。我只是建议,如果您要这样做,您应该意识到潜在的问题,并确保您确信利大于弊。

    【讨论】:

      【解决方案2】:

      听起来类库在 GNUStep 中已经过时了,至少在您使用的版本中 - [NSAutoreleasePool drain] 是在 OS X 10.4 IIRC 中添加的。不过我对 GNUStep 一无所知,所以我不知道是否有更新的库可用。

      您可以通过将“drain”替换为“release”来解决此问题。他们做的事情基本相同;添加了“drain”方法以用于垃圾收集应用程序,因为“release”在该环境中变为无操作。

      【讨论】:

        【解决方案3】:

        在我的应用主循环中使用 GNUStep:

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

        【讨论】:

          猜你喜欢
          • 2014-09-02
          • 2012-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 2023-02-12
          • 2011-11-02
          相关资源
          最近更新 更多