我正在尝试在Ubuntu Hardy上编译以下Objective-C程序,但由于某些原因,我收到了警告. #import Foundation/Foundation.hint main (int argc, char *argv[]){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSLog (@"
#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
我该如何解决这个问题?
首先,简单的答案:使用-release代替.我相信-drain在10.4中被添加为-release的别名,并且在10.5中它获得了自己的GC特定行为.这允许代码在10.5中使用它并仍然在10.4下工作. GNUstep可能还没有新功能.显然你正在Ubuntu上尝试一些样板代码的Objective-C代码,但它让我想知道你希望长期实现什么.如果只是出于好奇或挑战,请不要让我阻止你.但是,如果你计划使用GNUstep为严肃的编程开发Objective-C,我会建议反对它,原因有几个.
> Objective-C是一种有趣的编程语言,具有许多强大的功能,但与其他面向对象的语言相比,本身并没有那么明显.当你将它与Cocoa和其他相关框架中的酷炫功能配对时,Objective-C真的变得引人注目. Apple(主要)推动这些框架,仅适用于Mac / iPhone.
> Apple通常拥有Objective-C开发的最佳工具和用户体验.他们还在LLVM和Clang的开发上投入巨资,作为gcc的替代品.这将(一个已经确实)使一些非常酷的东西成为可能gcc不是为此而设计的.
> GNUstep是一个令人钦佩的项目,但由于它依赖于志愿者和逆向工程Apple添加的新功能,它总是落后于最先进的技术.新的闪亮的Objective-C功能将始终从Apple开始,并且(通常)最终会逐渐减少.
>构建跨平台应用程序可以在Objective-C中完成,但其他语言更适合该任务. (我并不是一个粉丝,而是建议Objective-C是解决每个问题的最佳解决方案.使用你手边的最佳工具.)
我不是说在他们的“原生平台”以外的东西上使用语言是不好的.我只是建议,如果这就是你要做的事情,你应该意识到潜在的问题,并确保你确信优点胜过缺点.