参考資料
クラスの定義
Objective-Cのクラス定義を理解しよう
Objective-Cのクラスやプロパティ、特徴的なメソッドの使い方
objective-c の歴史
c +--- c++
+-- objective-c --- objective-c++
NextStep - OpenStep - MacOS X なので、 NSXXX というクラス名が多い。
xcode
LLVM と clang(くらん)
LLVM と gcc
clang はフロントエンド
objective-c -(frontend)- LLVM IR -(backend)- ARM | x86 etc
clang は c, c++, objective-c, objective-c++ をサポート。
clang はオープンソース
clang は dylib だけど、gcc はコマンドラインで対話するので、clang は詳細な情報を提供できる。
クラス理解のステップ
- 基底クラス NSObject( 例外:NSProxy )
- デフォルトは @protected
- メソッドのインターフェースは h に @interface / @end
- メソッド 定義は m に @implementation /@end
+ クラスメソッド
- インスタンスメソッド
- (戻り値型)メソッド名
- (戻り値型)メソッド名:(引数型)引数1 ラベル:(引数型)引数2
+ alloc はメモリ確保とゼロ初期化
- init はそれ以外の初期化(通常これを再定義する)
引数を持つメソッドのサフィックスは引数のラベルにするのが慣例 - クラスメンバ変数や多重継承はない。
- 利用側では #import 。多重定義を防ぐ仕組みが入っている。
- メソッド利用
// オブジェクト型はポインタ表現。
// ARCで参照カウンタ式の自動リリース機構が機能するようになったため、明示的な破棄をしなくてもよい。
//(ARC だと retain, release などを使用しない)
Animal* p1 = [[Animal alloc] init];
Animal* p2 = [Animal new];
[p1 setAge:1 withName:@"はなこ"];
-
プロパティ @property
- settter/getter の自動生成。
- xxx だと setXxx が setter, xxx が getter
- _xxx という名前のメンバ変数(実体)が作られる
-
非公開メソッドやメンバはこう書こう
// 無名カテゴリによるクラスエクステンションを使った非公開メンバ変数とメンバ関数
// .m の先頭に interface を書く。
@interface MyClass () {
int _hoge; // 属性は _ で始めると統一感がある。
}
- (void)innerMethod; // というかプロトタイプ宣言自体が省略可能なので、これも省略していい。
@end
- C++ では 0 とか NULL でポインタを初期化、objective-c では nil。
// プリミティブな型
NSInteger age = 0;
// オブジェクト型はポインタで表現する
NSString* name = @"HogeHoge"; // オブジェクトリテラル
NSString* name = [[NSString alloc] init]; // 前からの記法
NSString* name = [NSString new]; // 新しい記法
tips ( xcode5 なら Ctrl + 6 でメソッド一覧 )
- #pragma mark -
- #pragma mark コメント
- // MARK: マークの説明
- // TODO: タスク内容
- // FIXME: 要修正の内容
- // !!!: 要注意の内容
- // ???: 疑問点
- #warning コメント
- #error コメント