読者です 読者をやめる 読者になる 読者になる

iPhoneアプリがつくりたいの(Objective-C入門戦)

コードでがりがり描いたわけではなく、先日の「たのしいCocoaプログラミング」を読んでObjective-C 2.0について興味もったところをピックアップしてみる。私はC, C++, C#とのふれあい期間が長いので、そっちの言語と比較した感想が多いです。なお、Objective-Cについては、20章あるうちの10章目。

たのしいCocoaプログラミング[Leopard対応版]

たのしいCocoaプログラミング[Leopard対応版]


Objective-Cの特徴>
▼一般的な文法的ルール

  • クラスの宣言(.hの中)には、インスタンス変数、publicメソッド宣言を書く。公開しないメソッドはソース(.m)に書くだけでよい。(ここはC++より優れている・・)
  • メソッド定義の基本的な考え方は引数1つ以下!2つ以上ある場合は2つ目以降の引数に"ラベル"を宣言する必要がある。これは、見苦しいメソッド名をつけなくてもいいようにするための処置。通常引数が増えてくると、それぞれの引数の意味を理解できるようにメソッド名に引数の意味を追加し始める。こういった追加の意味を"ラベル"に書き出して表現する(おもしろいね)
  • 言語はC言語ベースなので、基本的な変数であるchar, int, floatという型はそのまま使える。
  • 言語仕様の考え方はC++と同じ。ひとつのクラスを宣言するのにヘッダファイルと実体ファイルの両方が必要だし、クラスは基本的にポインタで表現される。
  • ぬるぽの表現は、nil( = 0)です。
  • C言語の世界とObjective-Cの世界を区分けするために[](大括弧)が使われている。メソッド呼び出しも[myclassA setcount:2]といった書き方をする。
  • nilオブジェクトのメソッドを呼び出したら、ぬるぽ例外ではなく無視。型に関わらず0返却


▼クラス関係

  • CocoaのすべてのクラスはNSObject継承。そしてNSObjectをあらわすのにid型というものがある。id型の実体はobjc_objectという構造体のポインタ型。(Javaとかだとobjectを表現するために使われているんでないかと。)
  • 基本的なメモリ管理は参照カウンタシステム。既定であるNSObjectにはretain, releaseメソッドがあるのでそれを利用する。(COMとか組み込み分野ではメジャーな方式っすね)
  • インスタンス化するためには (id)alloc, 初期化するためには(id)init, この両方を含めて[[myclassA alloc] init]という感じで生成するのが基本になる。
  • 自動解放なる仕組みとしてautoreleaseなる機構がある。これは今のシーケンス内限定のオブジェクトとして使用する場合に使える。これによって、シーケンス内での分岐にともなう乱雑なrelease呼び出しを避けられるというわけだ。便利かも。
  • deallocが解放関数。この中では必ず[super dealloc];をコールして親クラスも解放処理すること。
  • 他からもらったオブジェクトはretainを呼ぶ。通常参照数をあげるときは"オブジェクトを渡す側"が内部的に参照数をあげるわけだが、どうやらもらった側があげてやらなきゃあかんようだ。ここは変わってるか。


▼コーディングルール

  • クラスの先頭は大文字
  • インスタンス変数は先頭は小文字
  • メソッドの先頭文字は小文字
  • セッタにはsetCount, setIndexとつけるが、ゲッタにはcount, indexといった風にgetはつけない!


▼プログラムするための予備知識


さて、Objective-C 2.0の入門としてはこんなところ。でもさらっと流してわかっていないことがある。

  • クラスの継承に伴うオーバライド方法(抽象クラスとかアクセス権関係の性質とかも)
  • インスタンス変数、クラス変数はヘッダファイルへ記述するが、C, C#では、インスタンス変数やクラス変数へ直接アクセスする手段があった。この宣言方法だと呼び出す手段なさそうなので、できない?(最も、推奨された行為ではないですが)
  • ブール型の取り扱いはどうなってる?自分で定義するもの?実体はやっぱりCといっしょでint型?


このあたりの詳細な言語仕様については、一緒に買ったObjective-C 2.0の本で後で補完するとして、とりあえず次の章へ進みます。11章から、RSSリーダーをつくるみたいです。いきなりレベルあがりすぎじゃねえ?俺の考えすぎなんですか?そうなんですよね?きっと便利なクラスが用意されててそれ使うだけってことですよね?


詳解 Objective-C 2.0

詳解 Objective-C 2.0