5分でつまむeffective objective-c
DESCRIPTION
名著 Effective Objective-C 2.0 の項目をいくつか紹介しました。 iOS_LT #8 で発表した資料です。 Effective Objective-C 2.0 http://www.amazon.co.jp/gp/product/4798134198TRANSCRIPT
\5分でつまむ/
EffectiveObjective-C 2.0
iOS_LT #8 / @himara2
自己紹介・平松 亮介
・iOSエンジニア
・選挙アプリ Manifesto など
背景・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の方がベター
・容量がしんどくなってきた時に自動開放してくれる
・開放のタイミングもこちらでコントロールできる
まとめ
終わり