3

次のObjective-CプログラムをUbuntuHardyでコンパイルしようとしていますが、何らかの理由で警告が表示されます。

#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

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

3

クラスライブラリはGNUStepで古くなっているようですが、少なくとも使用しているバージョンでは、[NSAutoreleasePoolドレイン]がOS X10.4IIRCで追加されました。しかし、GNUStepについては何も知らないので、新しいライブラリが利用可能かどうかはわかりません。

'drain'を'release'に置き換えることで、この問題を回避できます。それらは基本的に同じことをします。ガベージコレクションされたアプリで使用するために「drain」メソッドが追加されました。これは、「release」がその環境では何もできないためです。

于 2009-06-29T04:55:49.383 に答える
3

まず、簡単な答え:代わりに使用-releaseしてください。-drain10.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開発に最適なツールとユーザーエクスペリエンスを備えています。彼らはまた、gccの代わりとしてLLVMClangの開発に多額の投資を行っています。これにより、gccが設計されていない非常にクールなことが可能になります(すでに実行されています)。
  3. GNUstepは立派なプロジェクトですが、ボランティアとAppleによって追加された新機能のリバースエンジニアリングに依存しているため、常に最先端のプロジェクトに遅れをとっています。新しい光沢のあるObjective-C機能は、常にAppleから始まり、(通常は)最終的には徐々に低下します。
  4. クロスプラットフォームアプリの構築はObjective-Cで行うことができますが、他の言語の方がはるかに適しています。(私は、Objective-Cがすべての問題に最適なソリューションであると示唆するほどのファンではありません。手元にある最高のツールを使用してください。)

「ネイティブプラットフォーム」以外で言語を使用するのが悪いと言っているのではありません。それがあなたがやろうとしていることであるならば、あなたは潜在的な問題を認識し、長所が短所を上回っていることを確信していることを確認するべきだと私は提案しているだけです。

于 2009-07-01T05:43:33.347 に答える
1

GNUStepを使用した私のアプリのメインループでは:

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool;
    AppController *delegate;

    pool = [[NSAutoreleasePool alloc] init];
    // ...
    [pool release];
    return NSApplicationMain (argc, argv);
}
于 2009-06-29T05:23:48.257 に答える