統計情報(30日間)


最新情報をツイート


人気の投稿

コードを秒速で参照できるショートカット

このエントリーをはてなブックマークに追加

Shift-Command-O (Open Quickly)はファイル名だけでなくメソッド名や関数名ほか各種定義でも行けるらしい。



試しに open と入れると...


おおおおぉ。これは知らなかった。便利。


待望の iOS7本

build date 埋め込みの、冴えた方法

このエントリーをはてなブックマークに追加

面白い。



引用:
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
[formatter setDateFormat:@"MMM d yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
 
NSString *string = @__DATE__;
NSDate *buildDate = [formatter dateFromString:string];
[formatter release];

@__DATE__ はコンパイルでその時点の日付の文字列に置換されてリテラル値としてアプリに組み込まれる。なので、その後いつアプリを実行してもこの値はビルド日時を示す。ベータ版の期限切れのチェックなどに使える。なお時間まで必要な場合は同様に @__TIME__ が使える。

Xcode5 ショートカット

このエントリーをはてなブックマークに追加

よく使われる実用的なキーボード(とマウスの)ショートカットが紹介されている。



↓個人的にこれが一番知りたかった。

NSCoding が捗るマクロ

このエントリーをはてなブックマークに追加



こういうのを用意しておけば
#define OBJC_STRINGIFY(x) @#x
#define encodeObject(x) [aCoder encodeObject:x forKey:OBJC_STRINGIFY(x)]
#define decodeObject(x) x = [aDecoder decodeObjectForKey:OBJC_STRINGIFY(x)]

これが
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if(self) {
        _obj = [aDecoder decodeObjectForKey:@"_obj"];
    }
    return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeInt:_val forKey:@"_obj"];
}

こうなる
(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if(self) {
        decodeObject(_obj);
    }
    return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    encodeObject(_obj);
}


いつもコード書いてて気になってたところなので自分的にはかなりヒット。このマクロを使うメリットはキー値のタイプミスをコンパイラで拾うことができるところ。もちろんコード量も減る。(最初のケースだと一箇所間違えて @"_objj" と書いてもコンパイラはエラーは出さないし、実行時に意図通りに動かない)


仕組みは単純で # を使ってる。
Cでは #を使うとシンボルを文字列として扱うことができる。
#define STRINGIFY(x) #x
int myVariable = 5;
NSLog(@"%s", STRINGIFY(myVariable));
と書けば、"myVariable" がログに出る。

Obj-Cの文字列への変換もできて
#define OBJC_STRINGIFY(x) @#x
int myVariable = 5;
NSString *foo = OBJC_STRINGIFY(myVariable);
NSLog(@"%@", foo);
も "myVariable" がログに出る。

ViewControllerのカスタムトランジションの作り方

このエントリーをはてなブックマークに追加

面白いのは新旧ViewControllerのビューのスクリーンショットを取ってトランジションさせるところ。

スクリーンショットを作るオーバーヘッドはあるけど一旦画像が作れればその後の自由度は高い。なるほど。

トランジション例



スクリーンショット画像作成コード
CALayerをレンダリングさせるのか。
//Create a UIImageView from the given layer
- (UIImageView*)takeScreenshot:(CALayer*)layer{
     
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, [[UIScreen mainScreen] scale]);
    [layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIImageView *screnshot = [[UIImageView alloc] initWithImage:image];
     
    return screnshot;
}



コレクションオペレータ

このエントリーをはてなブックマークに追加



こんなデータ構造があった時
NSArray *animals=@[
      @{@"name"         : @"Dog",
        @"numberOfLegs" : @4,
        @"breeds"       : @[
                             @{@"name" : @"Lab",        @"price" : @299.99},
                             @{@"name" : @"Collie",     @"price" : @199.99},
                             @{@"name" : @"Shepard",    @"price" : @299.99}
                           ]
        },
      @{@"name"         : @"Cat",
        @"numberOfLegs" : @4,
        @"breeds"       : @[
                             @{@"name" : @"Siamese",    @"price" : @99.99},
                             @{@"name" : @"Persian",    @"price" : @89.99},
                             @{@"name" : @"Himalayan",  @"price" : @79.99}
                           ]
        },
      @{@"name"         : @"Spider",
        @"numberOfLegs" : @8,
        @"breeds"       : @[
     :

numberOfLegsの平均値は1行で求められる。
id avgNumberOfLegs = [animals valueForKeyPath:@"@avg.numberOfLegs"];
オペレータは @min, @max, @avg, @count, @sum などの集計系の他、@unionOfObjects などの集合系がある。
NSArray* names = [animals valueForKeyPath:@"@unionOfObjects.name"];
なら
(
    Dog,
    Cat,
    Spider,
    Fish,
    Goose
)
となる。特定要素の列挙したい場面は多々あるのでこれは便利。


関連情報)



LLDB ブレークポイント tips

このエントリーをはてなブックマークに追加

一つ前のポストと似たような話題でブレークポイントのTIpsをもう一つ。
Stack-trace-dumping regular-expression-based symbolic breakpoints in LLDB



LLDBの --func-regex オプションを使うと正規表現でクラス名を指定できて、そのすべてのメソッドにブレークポイントを設定することができる。
(lldb) breakpoint set --func-regex NSLayoutManager
とすると NSLayoutManagerのそれぞれのメソッドでブレークポイントが働くようになる。
記事ではこのタイミングでスタックトレースを出力する方法が紹介されていた。
(lldb) breakpoint command add 2
Enter your debugger command(s).  Type 'DONE' to end.
> script print "----------"
> bt
> continue
> DONE
(lldb)
最後に continueを入れているので出力後は止まらずに実行を継続する。

メソッドのみを対象として、C関数を除外したい場合は頭に[を付ける。
(lldb) breakpoint set --func-regex "\[NSLayoutManager"
するとNSLayoutManagerLogDebug()などが除外される。

Xcode ブレークポイント Tips

このエントリーをはてなブックマークに追加

よく知られているTipsの他、条件によってブレークポイントを実行時に設定するなんて大技も紹介されている。



ブレークポイントではデバッガのコマンドを実行できるのでここにブレークポイント設定コマンドを書いておく。
コマンド
breakpoint set -f APViewController.m -l 33
この発想はなかった。面白い。

"ObjCがサクっと書けるコーディングTips"

このエントリーをはてなブックマークに追加

またまた手前味噌。クラスメソッドの . 表記や newメソッドの紹介など。



パフォーマンスを向上させる25の基本Tips

このエントリーをはてなブックマークに追加

基本的だが効果的なTipsが紹介されていている。



以下、意訳。
1. ARCを使う
2. reuseIdentifierを使う
3. 可能なかぎりOpaqueで(不透明で)
4. XIBを肥大化させない
5. メインスレッドをブロックしない
6. イメージはできるだけ表示サイズに合わせる
7. 適切なコレクションクラスを選ぶ
8. ネットワーク転送でGZIPを使う
9. ビューは再利用と遅延ロードする
10. キャッシュを使え
11. 必要ならCoreGraphicsで描く
12. メモリ警告が出たら不要なメモリを開放
13. 高コストなオブジェクトの再利用(NSDateFormatterの再利用)
14. スプライトシートを使う
15. 前の計算結果を使う
16. 適切なデータ型の選択
17. 背景画像は大きさに応じた方法で
18. UIWebViewは注意深く利用(重いJS Frameworkは避ける)
19. 影を付けるなら .shadowPathを使う
20. UITableViewを最適化する(いろいろなTips!)
21. 用途に応じた適切なストレージを選ぶ(いろいろなストレージ)
22. 非同期を活用して起動をスピードアップ、XIBは小さく
23. Autorelease Pool を使う
24. 画像キャッシュを意識する(imageNamed:の使用)
25. 日付は Unix timestampを使う(場合によっては)
参考になった。長いが一読をお勧め。

iOS6で始まったオートレイアウトのかんどころ

このエントリーをはてなブックマークに追加

今ちょうど四苦八苦しているところでもあり合点のいくことが多かった。
※リンク間違ってました..


10のポイントが挙げられている。以下、引用。
1. Rule of Thumb: At Least Two Constraints in Each Dimension
2. Embrace Intrinsic Size
3. IB Will Never Let You Create Ambiguous Layouts
4. Before You Can Delete An Existing Constraint, You Must Create Another One
5. Don’t Resize Controls Explicitly
6. Avoid Premature Optimization
7. Forget frame
8. Don’t Forget To Disable Autoresizing Masks
9. The Debugger Console Is Your Friend
10. Animate the Constraints, Not the Frame

1〜4 で指摘されているように、X,Yそれぞれの方向で最低2つの制約(Constraints)が必要であることを理解することが Autolayoutを使う上での基本ポイント。もし制約を削除したい場合は、先に3つ以上の制約を追加して置く必要がある。

例えば、次の状態で幅を可変にしたいとする

←−−−→|←−−−−−−−→|
左位置  幅の制約   
の制約         

まず右位置の制約(trailing space)を追加する。
←−−−→|←−−−−−−−→|←−−−→
左位置  幅の制約   右位置
の制約         の制約
この状態では左・右・幅共に固定。

制約が2つ以上になったので幅の制約を削除できる。
←−−−→|←−−−−−−−→|←−−−→
左位置  (可変)   右位置
の制約         の制約
すると幅が可変になる。

Xcodeで制約を加える場合、メニューを使う。

てっきりアイコンとかがあってワンタッチで設定!と思い込みがあったからAutolayoutを使う上で一番最初にこれがつまずいた。これはもっと簡単な方法があるのかしらん。

あと 7と10で「frameを直接触らない、制約を調整しろ」というのが新鮮だった。
7. Forget frame
10. Animate the Constraints, Not the Frame
Autolayout以降はレイアウト調整だけでなくアニメーションの仕方もやり方が変わるということか。

近日発売予定の iOS6本ではAutoLayoutにまるまる1章が割かれている。これは期待。
「Chapter 05 Auto Layout詳解」

パフォーマンス改善Tips

このエントリーをはてなブックマークに追加

OS X アプリの話だが iOSでも十分参考になる。具体的で役に立ついい記事。



項目のみ引用
1. できるだけ別スレッドで
- テキストサイズの計算
- Core Data のフェッチやインサート
- イメージのロードとサムネイルの生成
2. 必要になるまで作らない
3. 起動時の処理を少なく
4. 呼び出し回数を少なく
5. View を少なくする
6. 文字列検索は CFStringFind を使う
7. 定期的にチェック

CI Tips

このエントリーをはてなブックマークに追加

CIネタを続けて。かなり実用的なTips集。




CI絡みでchef関連のKindle本(ちょっと遠いが..)

@naoya_itoさんからChef Solo本が出ましたね。




空ループをワーニングで見つける

このエントリーをはてなブックマークに追加

Xcode 4.6 から追加された Empty Loop Bodies を使うと空のループを検出することができる。





空のループとは if (x==0); や while(i); みたいなやつ。

こんな感じで検出できる。



自分の場合 {}を必ず書くのであまりこのケースは遭遇したことがほとんど無いと思うが、破壊力あるバグなので有効にしておいて損はないかも。


Xcodeデバッグ Tips

このエントリーをはてなブックマークに追加

デバッグ Tipsのいいまとめ。Cmd+\ でブレークポイントが設定できるのか。



Edit Schmeでアプリデータの指定もできるらしい。
Edit Schmeを改めて見てみると、シミュレータデバイスの種類など色々設定できるのか。