5分でつまむEffective Objective-C

28
5分でつまむ/ Eective Objective-C 2.0 iOS_LT #8 / @himara2

description

名著 Effective Objective-C 2.0 の項目をいくつか紹介しました。 iOS_LT #8 で発表した資料です。 Effective Objective-C 2.0 http://www.amazon.co.jp/gp/product/4798134198

Transcript of 5分でつまむEffective Objective-C

Page 1: 5分でつまむEffective Objective-C

\5分でつまむ/

EffectiveObjective-C 2.0

iOS_LT #8 / @himara2

Page 2: 5分でつまむEffective Objective-C

自己紹介・平松 亮介

・iOSエンジニア

・選挙アプリ Manifesto など

Page 3: 5分でつまむEffective Objective-C

本日のポイント

欲しくなった瞬間にポチるhttp://p.tl/Xp0r

Page 4: 5分でつまむEffective Objective-C

背景・Effective Objective-C 2.0

・安定のEffectiveシリーズ

・レベルアップしたいiOSer向け, 52のtips

・これをベースにコーディング規約を作る会社も

Page 5: 5分でつまむEffective Objective-C

#importより@classを使う#1

Page 6: 5分でつまむEffective Objective-C

・.h に #import するよりも

・ヘッダファイルが他ファイルにimportされたとき、

・=> .m に #import, .h に@class宣言 が良い

不要な .h ファイルまでimportされてしまうのを防ぐ

#1 #importより@classを使う

Page 7: 5分でつまむEffective Objective-C

配列はリテラルで使おう#2

Page 8: 5分でつまむEffective Objective-C

NSArray *array = [NSArray arrayWithObjects:obj1, obj2, obj3, nil];

・リテラル表記の利点・簡単に書ける

#2 配列はリテラルで扱おう

・objectにnilが入ってた場合ちゃんと例外吐く

NSArray *array = @[obj1, obj2, obj3];

Page 9: 5分でつまむEffective Objective-C

#defineよりstatic constを使う#3

Page 10: 5分でつまむEffective Objective-C

・△ #define ALERT_TAG_WARNING 100

・理由

#3 #defineよりstatic constを使う

・◎ static const NSInteger ALERT_TAG_WARNING = 100

・型つきで宣言できる・誤って別箇所で上書きした時にwarning出る

・他のファイルでも使いたい場合は extern つけて宣言

Page 11: 5分でつまむEffective Objective-C

列挙子enum#4

Page 12: 5分でつまむEffective Objective-C

enum EOCConnectionState { EOCConnectionStateDisConnected, EOCConnectionStateConnecting, EOCConnectionStateConnected};

・オブジェクトの状態定義に

#4 列挙子enum

・テーブルのindexにenum TABLEVIEW_CELL_TYPE { TABLEVIEW_CELL_NOTICE, TABLEVIEW_CELL_FAQ, TABLEVIEW_CELL_VERSION};

Page 13: 5分でつまむEffective Objective-C

インスタンス変数へのアクセス#5

Page 14: 5分でつまむEffective Objective-C

・self.str = @”abc”;

#5 インスタンス変数へのアクセス

・NSLog(@”%@”, _str);

・writeする時はself経由でプロパティ属性を保持

・readする時は直接読み出しで高速に(getter経由しない)

・setter / getter で処理を入れてる場合は注意が必要

Page 15: 5分でつまむEffective Objective-C

Class Prefixのつけ方#6

Page 16: 5分でつまむEffective Objective-C

・RHViewController ×

#6 Class Prefixのつけ方

・2文字のprefixはAppleが予約している

・他と衝突しないよう3文字のprefixが推奨されている

・prefix はプロジェクト作成時に指定できる

・参考#confwd でOSSでのObjective-Cの書き方について話してきた

Page 17: 5分でつまむEffective Objective-C

descriptionとdebugDescription#7

Page 18: 5分でつまむEffective Objective-C

・description - NSLog で吐かれる

#7 descriptionとdebugDescription

・debugDescription - デバッグ時のpo等で吐かれる

iOS_LT #3 でデバッグについて発表しました

Page 19: 5分でつまむEffective Objective-C

非公開メソッドのプレフィックス#8

Page 20: 5分でつまむEffective Objective-C

・プライベートメソッドは p_XXX のようにすると◎

#8 非公開メソッドのプレフィックス

・デバッグ時や変更時に分かりやすいマーカー

・Appleは _XXX としているのでそれは避ける

・参考Objective-Cが好きになるTips & Hackを勝手に補足

Page 21: 5分でつまむEffective Objective-C

delegateの呼び出し部分をスッキリさせる#9

Page 22: 5分でつまむEffective Objective-C

if ([_delegate respondsToSelector:@selector(some:)]) { [_delegate some:value]; }

#9 delegateの呼び出し部分をスッキリさせる

①フラグを管理する構造体をつくる

②setDelegateでチェック

③呼び出し前はフラグのtrue/falseで判断

毎回checkする必要はない

Page 23: 5分でつまむEffective Objective-C

#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]; }

Page 24: 5分でつまむEffective Objective-C

NSCacheを使おう#10

Page 25: 5分でつまむEffective Objective-C

#10 NSCacheを使おう

・WebからDLした画像などのキャッシュに

・NSDictionaryでも可能だが、NSCacheの方がベター

・容量がしんどくなってきた時に自動開放してくれる

・開放のタイミングもこちらでコントロールできる

Page 26: 5分でつまむEffective Objective-C

まとめ

Page 27: 5分でつまむEffective Objective-C

この本すごい良さそうです

ね!!!!!!!http://p.tl/Xp0r\早速買う!/

Page 28: 5分でつまむEffective Objective-C

終わり