Objective-Cを勉強してみる

Xcodeを使ってみようと思って、Xcodeを起動してiPhoneSDKのサンプルを覗いてみた。
.mな拡張子のファイルがあって、Matlab!!?とか思いながら調べてみると、
どやらObjective-Cのファイルの拡張子は.mらしい。
wikipediaを眺めていると
メソッド呼び出しはメッセージ送信で行うらしい!
すげー!オブジェクト指向!!

ということで、勢いで勉強を始める。

本当はC言語

Objective-CC言語の拡張。
どうやらコンパイラObjective-CのコードをCのコードに変換するらしい。
追加された型や予約語も#defineやtypedefされているだけ。
マジか。それはビックリだ。


とりあえず、ここで一通り修行する。

メモ

  • 拡張子は.m
  • 基本 #include -> #import
  • クラス宣言は予約語や構文でなく、コンパイラディレクティブを利用。
@interface クラス名 : 親クラス名
{
      インスタンス変数宣言
}
メソッド宣言
@end

なんだこれ?キモイ!><

  • インスタンス変数はC++でいうところのprotected扱い!?
  • ルートクラスを継承するのが基本。GCCはObject、CocoaではNSObjectというクラス
  • ルートクラスを作ることもできるけどね。
  • メソッド宣言がキモイ。
- (戻り値の型) メソッド名 : 引数のリスト ; 
  • -で始まるのがインスタンスメソッド、+から始まるのがクラスメソッド
  • デフォルトの戻り値はid型(オブジェクトを表す汎用型)
  • 宣言と実装は完全分離
@implementation クラス名
メソッド定義
@end
  • Objective-Cにはnewとかない。インスタンス作成もクラスが行う。
    • 通常はルートクラスのallocというクラスメソッドでインスタンスを生成する。
    • allocの戻り値はid型。
    • allocがクラスの宣言情報からメモリを割り当てるらしい。すごい。alloc神。
  • メソッドの呼び出しはメッセージ式で行う。キモイ。
    • 動的らしい。よくわからんが。要勉強。
    • 動的ゆえ、実行時にメソッドを検索するためCに比べてオーバーヘッドが倍以上らしい。
id obj = [Test alloc]; // Testというクラスのインスタンスobjを生成
[obj method]; // objのメソッドmethodを実行
// objを使い捨てにするなら次のようにも書ける
[[Test alloc] method];

にゃるほどね。

風邪悪化

寝る