Objective-Cの履歴
C言語を拡張したもの。Cocoaはフレームワークの名称。
文字列
NSString* str = @"Hello World";
Ruby, PHPとの文字列操作比較
http://d.hatena.ne.jp/hetima/20061025/1161773698
デバッグ
NSLog(@"obj = %@", obj); // オブジェクトの場合 %@
foreach
NSArray *array = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; for (id i in array) { //なんか処理 }
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"value1", @"key1", @"value2", @"key2", @"value3", @"key3", nil ]; // キーでループする場合 for (id i in [dictionary keyEnumerator]) { // なんか処理 } // 値でループする場合 for (id i in [dictionary objectEnumerator]) { // なんか処理 }
enum
typedef enum{ Left = -1, Right = 1 } Direction; // 自動的にintになる?
Blocks
Rubylist歓喜。こんなことができるらしい
http://blog.livedoor.jp/faulist/archives/1470672.html
http://blog.livedoor.jp/faulist/archives/1471218.html
instanceof
NSObjectが定義してる isKindOfClass を使う
if ([obj isKindOfClass:[NSString class]]){ ...
メモリ管理
- allocしたらrelease、retainしたらrelease
- releaseの代わりにautoreleaseもあるよ
- 他の人が生成したやつには関わるな!
- @property(retain)は自動的にretain/releaseする
- delegateはretainするな。多くの場合循環参照になる
クラス
だいたいこんな感じ。インスタンス変数は@interfaceに定義します。
// Hoge.h @interface Hoge{ @private NSString* name; } - (void) say; @end // Hoge.m @implementation Hoge - (void) say{ NSLog(name); } @end
継承
// NSObjectを継承 @interface Hoge : NSObject{ } @end
プロトコル
Javaでいうインタフェース
@protocol Speakable - (void) say; @end
// 「実装する」とは言わず、「プロトコルに適合する」という @interface Hoge : NSObject<Speakable> - (void) say; @end
カテゴリ
メソッドのグループ化。これができるのはそもそもメソッドの動的追加ができるということ。インスタンス変数は追加できない。
@interface Hoge(Extension) - (void) jump; @end
この機能を使って非形式プロトコルというのが使える。その方法はNSObjectにメソッドを追加するだけ。そんなことやってもいいの?とすごく疑問に思うんだが...。コンパイラを通るためならしかたないのか。
メソッドの動的呼び出し
SEL hogeMethod = @selector(say); [hogeObj performSelector:hogeMethod];
NSNull
NSDictionary, NSArrayにnilは格納できない。NSNullを使う。
[dict setObject:[NSNull null] forKey:@"hoge"];
[NSNull null]はシングルトンっぽい。==比較でOK
if (val == [NSNull null]){ ... }
まだよくわかっていないこと
Google Objective-Cスタイルガイドのまとめ
http://www.textdrop.net/google-styleguide-ja/objcguide.xml
- インデントは2スペース
- 変数名、クラス名、メソッド名はCamelCase。クラス名は大文字開始
- hoge の setter は setHoge だが、getter は getHoge ではなく hoge
- クラスメンバ変数はアンダースコア(_)で終わること。myInstanceVariable_
- 定数名(#define、enum、constなローカル変数など)は小文字k開始のCamelCase。kConstValue
- @interfaceのコメントは必ず書く。パブリックメソッドについては機能、引数、戻り値、あらゆる副作用について説明する
- コメント中に変数名を入れる場合は |val| な感じで書く
- メンバ変数は @private にすべきだ
- イニシャライザを明確にする
- 0やnilに初期化するのは冗長
- プライベートメソッドとパブリックメソッドの区別はない
- 続きはあとで読む。。。
参考
最速マスター
http://d.hatena.ne.jp/fn7/20100203/1265207098
Google Objective-Cスタイルガイド 日本語訳
http://www.textdrop.net/google-styleguide-ja/objcguide.xml
Cocoa
http://wwwa.dcns.ne.jp/~nito/CocoaClub/