\5分でつまむ/
Effective
Objective-C 2.0
iOS_LT #8 / @himara2
自己紹介
・平松 亮介
・iOSエンジニア
・選挙アプリ Manifesto など
本日のポイント
欲しくなった瞬間にポチる
http://p.tl/Xp0r
背景
・Effective Objective-C 2.0
・安定のEffectiveシリーズ
・レベルアップしたいiOSer向け, 52のtips
・これをベースにコーディング規約を作る会社も
#importより@classを使う
#1
・.h に #import するよりも
・ヘッダファイルが他ファイルにimportされたとき、
・=> .m に #import, .h に@class宣言 が良い
不要な .h ファイルまでimportされてしまうのを防ぐ
#1 #importより@classを使う
配列はリテラルで使おう
#2
NSArray *array = [NSArray arrayWithObjects:obj1,
obj2,
obj3,
nil];
・リテラル表記の利点
・簡単に書ける
#2 配列はリテラルで扱おう
・objectにnilが入ってた場合ちゃんと例外吐く
NSArray *array = @[obj1, obj2, obj3];
#defineよりstatic constを使う
#3
・△ #define ALERT_TAG_WARNING 100
・理由
#3 #defineよりstatic constを使う
・◎ static const NSInteger ALERT_TAG_WARNING = 100
・型つきで宣言できる
・誤って別箇所で上書きした時にwarning出る
・他のファイルでも使いたい場合は extern つけて宣言
列挙子enum
#4
enum EOCConnectionState {
EOCConnectionStateDisConnected,
EOCConnectionStateConnecting,
EOCConnectionStateConnected
};
・オブジェクトの状態定義に
#4 列挙子enum
・テーブルのindexに
enum TABLEVIEW_CELL_TYPE {
TABLEVIEW_CELL_NOTICE,
TABLEVIEW_CELL_FAQ,
TABLEVIEW_CELL_VERSION
};
インスタンス変数へのアクセス
#5
・self.str = @”abc”;
#5 インスタンス変数へのアクセス
・NSLog(@”%@”, _str);
・writeする時はself経由でプロパティ属性を保持
・readする時は直接読み出しで高速に(getter経由しない)
・setter / getter で処理を入れてる場合は注意が必要
Class Prefixのつけ方
#6
・RHViewController ×
#6 Class Prefixのつけ方
・2文字のprefixはAppleが予約している
・他と衝突しないよう3文字のprefixが推奨されている
・prefix はプロジェクト作成時に指定できる
・参考
#confwd でOSSでのObjective-Cの書き方について話してきた
descriptionとdebugDescription
#7
・description - NSLog で吐かれる
#7 descriptionとdebugDescription
・debugDescription - デバッグ時のpo等で吐かれる
iOS_LT #3 でデバッグについて発表しました
非公開メソッドのプレフィックス
#8
・プライベートメソッドは p_XXX のようにすると◎
#8 非公開メソッドのプレフィックス
・デバッグ時や変更時に分かりやすいマーカー
・Appleは _XXX としているのでそれは避ける
・参考
Objective-Cが好きになるTips & Hackを勝手に補足
delegateの呼び出し部分をスッキリさせる
#9
if ([_delegate respondsToSelector:@selector(some:)]) {
[_delegate some:value];
}
#9 delegateの呼び出し部分をスッキリさせる
①フラグを管理する構造体をつくる
②setDelegateでチェック
③呼び出し前はフラグのtrue/falseで判断
毎回checkする必要はない
#9 delegateの呼び出し部分をスッキリさせる
①フラグを管理する構造体をつくる
②setDelegateでチェック
③呼び出し前はフラグのtrue/falseで判断
struct {
unsigned int didReceiveData: 1;
unsigned int didFailedWithError : 1;
} _delegateFlags;
- (void)setDelegate:(id<SomeProtocol>)delegate {
_delegateFlags.didReceiveData =
[delegate respondsToSelector:@selector(didReceiveData:)];
}
if (_delegateFlags.didReceiveData) {
[_delegate some:data];
}
NSCacheを使おう
#10
#10 NSCacheを使おう
・WebからDLした画像などのキャッシュに
・NSDictionaryでも可能だが、NSCacheの方がベター
・容量がしんどくなってきた時に自動開放してくれる
・開放のタイミングもこちらでコントロールできる
まとめ
この本すごい
良さそうです
ね!!!!!!!
http://p.tl/Xp0r
\早速買う!/
終わり

5分でつまむEffective Objective-C