#!/usr/bin/env objc-run @import Foundation; @implementation Hello : NSObject - (void) sayHelloTo:name { printf("Hello %s, my address is %p\n", [name UTF8String], self); } @end int main () { id hello = [Hello new]; [hello sayHelloTo:@"sunshine"]; }
これは、単一のファイルからの完全なプロジェクトであり、すぐに実行できます。 カットの下-このミニマリズムに到達することを可能にした技術の説明。
- すべてがmain.mに書き込まれます。 または「Test.m」など。 main()関数は任意のファイルに含めることができます。
- objc-runを使用します。 まだ遭遇していない場合、 objc-runは「Objective-Cファイルをコンソールスクリプトのようなタスクとして簡単に使用できるようにする」優れたユーティリティです。 インストール:
brew install objc-run
brew install objc-run
ソースファイルに実行権限を追加します:chmod u+x main.m
- プリコンパイル済みヘッダーの代わりのモジュール。 おそらく、大規模なプロジェクトの#importsとPCHで意味がありますが、小さなテストプログラムの場合はどうでしょうか。 いいえ、本当に。
-
@interface
宣言なし@implementation
すると、@implementation
ディレクティブで直接スーパークラスを指定できることがわかりました。 これがどのような目的で許可されているかは明確ではありませんが、@interface
ブロックを完全に取り除くことができます。 - 暗黙的な関数パラメーター型。 ObjCメソッドの返される型とパラメーターは暗黙的に等しい(id)です。つまり、
-(id)doSomethingWith:(id)param
; これは-doSomethingWith:param
とまったく同じです。 しかし、2番目のオプションの方が便利です。 - main()に引数はありません。 これは悪い習慣と見なされ
void main ()
、int main (int argc, char**argv)
代わりにvoid main ()
を記述することは完全に受け入れられます。 これらの引数をまだ使用しないのに、なぜすべてを発表するのですか? -
main()
でreturn
を取り除きます。 C99標準以降、returnステートメントなしでmain()
から制御が返される場合、return 0;
が呼び出されたと想定されreturn 0;
- NSLogの代わりにprintf。 NSLog-エラーメッセージ用であり、テキスト出力用ではありません-各行に実行可能ファイルへのパスとストリームIDを表示する必要はありません。
翻訳者のメモ:
@interface
がない場合
@interface
警告出力は私を困らせます:
/dev/fd/63:3:17: warning: cannot find interface declaration for 'Hello' @implementation Hello : NSObject ^ 1 warning generated.
これは
warn_undef_interface
であり、対応する-Wフラグはありません(タイプ
warn_undef_interface
警告を抑制するため)。 それで、自分のために空のインターフェースを残しました。
#!/usr/bin/env objc-run @import Foundation; @interface Hello : NSObject @end @implementation Hello - (void) sayHelloTo:name { printf("Hello %s, my address is %p\n", [name UTF8String], self); } @end int main () { id hello = [Hello new]; [hello sayHelloTo:@"sunshine"]; }
