ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2010年3月10日水曜日

Objective-C:カテゴリで「できること」と「できないこと」

Objective-C のカテゴリについて「できること」「できないこと」をまとめました。

<<できないこと>>
  • 同じクラスの別のカテゴリに宣言されているメソッドを確実にオーバーライドすること
    =>クラスの @interface セクションで明示的に宣言されているメソッドの再定義を避けるべき
    リンク順で呼ばれる関数が変わってしまう・・・
  • クラスのインスタンス変数の追加
  • 既存のカテゴリと同名のカテゴリの追加
  • 同じクラスに定義されている同名のメソッドの呼び出し
<<できること>>
  • クラスへのインスタンスメソッド追加
  • クラスへのクラスメソッド(スタティックメソッド)追加
Appleの「Object C 言語」には「カテゴリの使い方」として以下のような例が挙げられています。
  • 関連するメソッドをグループ化する簡単な方法を提供します。異なるクラスで定義した類似のメソッドを、同じソースファイルにまとめることができます。
  • 複数の開発者がクラス定義に取り組むような大きなクラスの管理を簡素化できます。
  • 非常に大きなクラスについて、インクリメンタルコンパイルのメリットがある程度得られます。
  • よく使用するメソッドについて、参照の局所性を向上するのに役立ちます。
  • 個々のアプリケーションに合わせてクラスを異なるように設定することが可能となり、同じソースコードのさまざまなバージョンを維持する必要性をなくします。
「既存 API の上書きを行わない」ということに注意していれば、それなりに便利に使えるのでしょう。
既存 API の上書きについて、ruby のクラス再定義に近いのかと思いましたが、ruby が「後勝ち」を保証しているのに対し、objective-c では「未定義」となっているので注意が必要です。
ruby は alias を駆使してオリジナルの API を呼ぶための方法が提供されている点も大きな違いです。


2009年8月9日日曜日

iPhoneアプリ開発(その2:Objective-C編)

今日はObjective-Cの学習をメインに行いました。
C言語を拡張してオブジェクト指向対応させた言語ということでC++と似たものかと思っていましたが、全く別物だということが分かりました。
C++が静的型付け言語であるのに対し、Objective-Cは動的型付け言語になっています。
カテゴリ機能により既存クラスにメソッドを追加できる所などは、ruby等のスクリプト言語を想起させます。
その他、注目ポイントを列挙しておきます。
  • プロトコル(形式プロトコル)は Java の Interface 相当のもの
  • セレクタは Java の Reflection における Method クラスのようなもので、@selector指示子もしくはNSSelectorFromStringメソッドで取得できる
  • 任意のインスタンスにおいて class メソッドで Class インスタンスを取得でき、クラスのメタ情報を取得できる
  • NSObject は以下のようなメソッドを持っていて、Class やセレクタと組み合わせて様々な情報を得ることができる
    • respondsToSelector: 引数で渡されたセレクタが実装されているかどうかを調査
    • performSelector: セレクタで渡されたメソッドを呼び出す
    • isKindOfClass: 継承関係の調査
    • isMemberOfClass: 継承関係ではなくそのクラス直属のインスタンスかどうかを調査
    • description クラス名を文字列で返す
今日の学習は以下のサイトを利用しています。非常に分かりやすくまとまっていて役に立ちました。
http://journal.mycom.co.jp/column/objc/index.html

iPhone自体の勉強はまた明日・・・。