Objective-C

  • 基本的にCのスーパーセット。C99か何かをサポートしている模様。
  • できあがるバイナリも普通のELFバイナリ。
    • JavaみたいにVMはないし、Rubyみたいにインタプリタもない。
    • エントリポイントはふつうに int main(int, char**)
    • #include とやって、-framework Cocoaとかやってふつうのgccでコンパイル。
  • クラスのようなものは存在しない
    • 全て@interfaceで、メソッドを実装すると具象化する模様。
    • シンタックスは適当に。
    • id obj = [ClassName alloc]; がnewの代わり。ただしObjectを継承しているものに限る。
    • よくわからないけどメソッド呼び出しはメッセージと呼ばれる。
  • idというプリミティブ型が用意されている模様。
  • C++でいうところのnewのようなものはあるけどdelete相当のものはあんまりない。
    • NSObjectを継承するとdeallocらしきものがある。
    • poolなるものに登録すると、参照カウンタをつけてGCしてくれる?
    • ctor/dtorが自動的に呼ばれることはないので、自分で作って自分で明示的に呼び出さなければならない
    • いや、やっぱり+(id)newというメソッドを使えば[[KlassName alloc] init]になるらしい

と、ここまで列挙しておいて、C++的な観点から気になるところを先に書いておく。

  1. 純粋仮想関数は作れる?
  2. メソッドのstatic/constなんかの指定はできるのか?
  3. java.io.concurrentみたいなのはある?
  4. 本当にオブジェクトを解放するのか?
  5. C++よろしく演算子やストリームを作るくとはできないか?
  • A. オブジェクト解放は、-(id)free; を使えばよいらしい。
  • id型のオブジェクトは実行時に評価される。実行時にエラーが出る場合が多い。
    • コンパイル時にエラーを検出したいなら、明示的に型を表現する変数を使え
  • @publicとか@privateとか使えばよい
  • staticメソッドは、-を+にすればよいらしい-(int)getInt; -> +(int)getInt;とかするということか
  • ただしstatic変数はない
  • 疲れてきた
  • Nilというものがあるらしい
  • @selectorというのを作ることができるらしい。セレクタのことかー!!!
  • 速度が要求される場合にはIMP型というのを使えば、内部表現の関数を直接呼べるとか
  • @protocolコンパイラディレクトリというのがあるとか。friend関数のことかー!!!
    • いや、なんかテンプレートのことかー!!! (ようわからん

脅える必要はありません。 Objective-C は C 言語と完全に互換性のある言語なので、C 言語のソースコードをコンパイルすることができます。 そして、C 言語にオブジェクト指向を実現するためのいくつかの機能を追加しているのです。 幸いに Objective-Cオブジェクト指向C++ 言語よりはシンプルな構造です。

また、様々な言語の解説文書を記述してきた筆者の経験では、最も学習手順の構成が難しい言語でした。 Objective-C 言語の基本部分の特定の機能を学習するためには、Objective-C 言語全体の構造を理解しなければならないという難しさがあるため、オブジェクト指向の初心者はこの言語の基本部分の本質を理解するのは困難でしょう。 できれば、C++ 言語の知識と本質的なオブジェクト指向の理解が必要です。

こたえ

  1. 純粋仮想関数は作れる?
    1. どうやら無理っぽい
  2. メソッドのstatic/constなんかの指定はできるのか?
    1. staticは、場合によってはある
    2. constは、なさげ?
  3. java.io.concurrentみたいなのはある?
    1. 処理系の話なので関係ないかも
  4. 本当にオブジェクトを解放するのか?
    1. 解放は、やろうと思えばできる
    2. 調べれば資料は多いが混乱しそう
  5. C++よろしく演算子やストリームを作るくとはできないか?
    1. 不明