xcode のエディタでカレント行に色を付けるプラグイン

xcode のエディタでカレント行をハイライトさせるプラグインが紹介されていたので、早速使ってみた。

参考:xcode-4-Fixins | Cocoaの日々情報局

設定手順
1. https://github.com/davekeck/Xcode-4-Fixins より、xcode-4-fixins を取得する
2. XCFixin_CurrentLineHighlighter プロジェクトをビルドする
3. xcode を再起動すると以下のメニューが表示されているので選択する
4. カレント行に付ける色を選択すると以下の様にエディタでカレント行に色を付加することができる

プラグインがインストールされる場所:
/Library/Application Support/Developer/Shared/Xcode/Plug-ins

– プラグインがインストールされると xcode にメニューが追加される
current_line_highlight_color1

– コード エディタのカレント行に選択した色が表示される
current_line_highlight_color2

ARC を利用している際に注意すること

ARC を利用していて少し気づきにくい問題に遭遇したのでメモしておく。

例えば、以前は baseViewController に addViewController を addSubView して表示する場合、以下の様なコードを書いていたがコレだと、ARC を利用した場合に BAD_ACCESS が発生する場合がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 1. ARC 以前のコード
@implementation baseViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
 
    UIViewController *_tv = [[addViewController alloc] initWithNibName:@"addViewController" bundle:nil];
 
    _tv.view.center = self.view.center;
    [self.view addSubview:_tv.view];
}

retain count を考慮していると上記の様なコードが記述できたが、ARC を利用していると viewDidLoad メソッドを処理を抜けたタイミングで _tv が解放されるため、_tv 上のオブジェクトにアクセするする処理を行うと BAD_ACCESS が発生する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 2. ARC を利用した際のコード
@interface baseViewController ()
@property(strong, nonatomic) addViewController *tv;
@end
 
@implementation baseViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
 
    _tv = [[addViewController alloc] initWithNibName:@"addViewController" bundle:nil];
 
    _tv.view.center = self.view.center;
    [self.view addSubview:_tv.view];
}

ARC 利用時は _tv が解放されないように包含されるクラスのメンバ変数としておく必要がある。
当たり前といえば当たり前だが、できるだけアクセスしなくてよいメンバ変数は定義しないようにと意識してるとハマります。
この問題最初に遭遇した時、1時間悩みました。(ノД`)

iPad4 ゲットしました ^_^

ipad4

はじめて自分用の iPad をゲットしました。
そろそろ端末のバランスも良いと感じられたこと(Retinaディスプレイ、処理能力、バッテリ性能)と、iPad で利用できるサービス、特に電子書籍を利用したかったというのが購入の理由です。

購入はどちらで買っても大差ないようだったので、Appleストアに出向いて買いました。
行って気づいたのが、スマートカバーの赤ってストアだけで購入できる色ということ。

早速、紀伊國屋書店の kinoppy を利用して JOJO を読んでますが、処理能力・使い勝手に問題はありません。
寝転がって読む際に若干端末の重さが気になることがある程度ですね。
Retina ディスプレイはホント綺麗です。

購入したのは Wifi 版ですが、無料スポットが結構あること、今後、iPhone5 を購入した際にテザリングを利用できますしね。(N700系 新幹線でも wifi 使えます。)

年末年始で色々 iPad アプリを利用してみようと思います。

Interface Builder で TableView と Cell を関連づける手順

基本的に Interface Builder は使わない派なのですが、先日必要に迫られて利用した際に TableView と Cell を関連づけるのに苦労したのでメモしておく。

1. Interface Builder で TableView をビューに貼り付ける

1_Interface Builder で TableView をビューに貼り付ける

2. Interface Builder のテーブルビューから右マウスクリックでヘッダに IBOutlet 宣言を作成する

2_Interface Builder のテーブルビューから右マウスクリックでヘッダに IBOutlet 宣言を作成する

3_Interface Builder のテーブルビューから右マウスクリックでヘッダに IBOutlet 宣言を作成する

3. Interface Builder で Empty – .xib ファイルを作成し、テーブルビューのセルを作成する

4_Interface Builder で Empty - .xib ファイルを作成し、テーブルビューのセルを作成する

4. Interface Builder でテーブルビュー セルの”Custom Class – Class”を自クラス名を設定する

5_Interface-Builder-でテーブルビュー-セルの'Custom-Class---Class'を自クラス名を設定する

5. テーブルビューの”datasource”を”File’s Owner”に設定する

6_テーブルビューの%22datasource%22を%22File's Owner%22に設定する

6. テーブルビューに表示するデータ配列を作成する
7. テーブルビューのセル クラスを作成する
8. Interface Builder でテーブルビュー セルの”Table View Cell – Identifier”をソースコードと同じに設定する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    static NSString* identifier = @"TableViewCell";
 
    TableViewCell* cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    if (nil == cell) {
        cell = (TableViewCell *)[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                       reuseIdentifier:identifier];
        // リソースが NSArray で取得される
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:nil options:nil];
        for (id oneObject in nib) {
            if ([oneObject isKindOfClass:[UITableViewCell class]]) {
                cell = (TableViewCell *)oneObject;
                break;
            }
        }

リソースが NSArray で返されるのでクラスを判定して適切なリソースを適用するようにしなくてはならない。
一つの.xib ファイルに複数のリソースを作成できるようなので、このような手順になるんでしょう。

7_Interface-Builder-でテーブルビュー-セルの'Table-View-Cell---Identifier'をソースコードと同じに設定する

注意点

1. .xib と ソースファイルが紐付けられない場合、File’s Owner のクラス名設定が合致していない場合がある

2. this class is not key value coding-compliant for the key
メッセージが表示される場合、Interface Builder の設定に問題がある
オブジェクトの追加、削除を繰り返していると、不要な設定が残っていることがある。

正直、Interface Builder はプログラマにとってあまりメリットが感じられない。
メリットとしては「モックを早く作る」とか「オブジェクトを配置する際の座標を調べられる」程度かと思います。
オブジェクトへの設定などはコードで行った方があとで検索などでチェックしやすかったり、生成処理を統一できたりメリットがあります。
こういうツールって一見便利そうに見えて実は便利じゃないって感じなんですよね。
一応、今風を知っておくということで触ったが、こういうのを抵抗感なく多用できるタイプではないです。(>_<) 適材適所ってやつが重要ですよね。

Block 構文について

BlocksKit を利用し始めたので、少々 Block 構文を復習しておく。
Block を利用したライブラリを使える知識と構文に慣れるということを目的とする。

とりあえず、以下の事柄がわかってればいいかな?
関数ポインタと Block が同じように使えると気づいておくことが重要で、”関数の返値に Block を使う”表記はなるほどって感じ。

C++/CLI やって以来のハットを使った。(^^)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Blocks 構文
^ 返値の型 (引数リスト) {}
 
^ (引数リスト) {}		// 返値の型を省略
^ {}				// 引数リストを省略
 
// C言語 関数ポインタ
int (*funcptr)(int) = &func;
int result = (*funcptr)(10);
 
// Block 型変数に代入
int (^blk)(int) = ^(int val){return val + 1;};
 
// Block 型変数から Block 型変数への代入
int (^blk1)(int) = blk;
 
int (^blk2)(int);
blk2 = blk1;
 
// 関数の引数に Block 型変数を渡す
void func(int (^blk)(int)) {
}
 
typedef int (^blk_t)(int);
void func(blk_t blk) {		// 関数の引数に Block を指定する
}
 
// 関数の返値に Block を使う
int (^func()(int)) {
}
 
typedef int (^blk_t)(int);
blk_t func() {			// 関数の返値に Block を使う
}

参考: エキスパートObjective-Cプログラミング に詳しく説明があります。

補足:
通常ブロック外の変数はブロック内で変更することができない。
変数に「__block」修飾子をつけることでブロック内での変更が可能になる。