いよいよ本屋に並びますね。
で、かねてから伝えてたとおり「Xcode3の補足説明」のPDFは以下からダウンロードできます。
iOSデバッグ&最適化技法 for iPad/iPhoneサポートページ
ほんと、皆さん、お手数おかけします。
ということで、前回の続き。
Chapter-3では自動解放機構の存在が判明するわけですが、じゃ、いったいどういう機構なんだということで、Chapter-4に突入します。
ですわ。
Appleのサンプルソースなんかでたまに見かけるというかmain関数にいつでもいますよ~な、このオブジェクトの正体はautoreleaseを実現するための装置なわけでして、このオブジェクトを一定の区間で作って解放する事で、自動解放機構が実現されてるんだという話をAppleのドキュメント
Cocoaメモリ管理プログラミングガイド
を引用しながら、ダミーのクラス(NSObjectを継承してdeallocメソッドをオーバーライド、ただしやってるのはsuperにdeallocメッセージを投げるだけ)を用意してdeallocメソッドにブレークポイントを設置、NSAutoreleasePoolオブジェクトの解放との連動具合を実際に確認したりします。
で、まあ、その過程で「Cocoaメモリ管理プログラミングガイド」で記述されている[NSString stringWidthFormat…]が簡易コンストラクタと呼ばれる事、そしてCocoaメモリ管理の肝である
を発見するに至るわけです。
たいがい、このルールを破った事でハングアップしてるわけですよ。
ということで、やれやれretain問題は一段落なんだけど、retainしたらreleaseしないといけないわけで、Chapter-2でretainしたNSStringオブジェクトは最終的にリークしちゃうわけです。
これがChapter-5のテーマ
に繋がっていくわけですな。
ですよ。「iPhoneアプリ開発、その(161) 俺はInstrumentsでいくぜ」でも使ってるけど、Chapter-5ではChapter-2のメモリーリークをInstrumentsを使って調査していくわけです。
で、見つかった場所が
なんだけど、当然これtがChapter-6の呼び水になるわけですな。
ドットってなんだよと。
cellはUITableViewCell*なんだからオブジェクトのポインタのはずで、ドットなんかでtextLabelと結べるわけねーじゃんとC/C++経験者の疑問にChapter-6では
Objective-C 2.0 プログラミング言語
を引用しながら答えを探していくわけです。で、このドット構文を調べていくと必然的にぶつかるのが@propertyでして、この2つの機能をChapter-4同様、実験用のクラスを定義してコンソールを駆使しつつ実践で確認していくわけです。
まあ、これでサンプルソースを読む上で重要な知識、ドット構文、@propertyを得るわけですが、この確認作業でちょっとした事件がおきるわけです。
というのもUILabelのtextの@propertyはcopyのはずなのに、Instrumentsではcopyではなくretainが呼ばれてる事がわかるんですわ。
なぜだ?と
これにはNSString、NSMutableStringの違い、そしてポリモーフィズムによるしかけが炸裂してるわけで、これをプログラムで試しながら検討していくわけです。
そしてポリモーフィズムを使った、iOSで最も有名な機構がデリゲートデザインパターンというわけで、それは何だとChapter-7へとなだれ込んでいくわけです。
続く。
で、かねてから伝えてたとおり「Xcode3の補足説明」のPDFは以下からダウンロードできます。
iOSデバッグ&最適化技法 for iPad/iPhoneサポートページ
ほんと、皆さん、お手数おかけします。
ということで、前回の続き。
Chapter-3では自動解放機構の存在が判明するわけですが、じゃ、いったいどういう機構なんだということで、Chapter-4に突入します。
NSAutoreleasePool
ですわ。
Appleのサンプルソースなんかでたまに見かけるというかmain関数にいつでもいますよ~な、このオブジェクトの正体はautoreleaseを実現するための装置なわけでして、このオブジェクトを一定の区間で作って解放する事で、自動解放機構が実現されてるんだという話をAppleのドキュメント
Cocoaメモリ管理プログラミングガイド
を引用しながら、ダミーのクラス(NSObjectを継承してdeallocメソッドをオーバーライド、ただしやってるのはsuperにdeallocメッセージを投げるだけ)を用意してdeallocメソッドにブレークポイントを設置、NSAutoreleasePoolオブジェクトの解放との連動具合を実際に確認したりします。
で、まあ、その過程で「Cocoaメモリ管理プログラミングガイド」で記述されている[NSString stringWidthFormat…]が簡易コンストラクタと呼ばれる事、そしてCocoaメモリ管理の肝である
1.alloc、new、copy以外で始まるメッセージで生成されたオブジェクトは、放って おけば自動的に解放される。
2.もしそのようなオブジェクトで自動的に解放されては困る場合はretainを呼ぶ。
3.alloc、new、copyで始まるメッセージで生成したオブジェクトを自動的に解放したいならautoreleaseメッセージを送る。
4.retain、releaseは参照カウントを即座に増減させるが、autoreleaseは遅延して参照カウントを減らす。
2.もしそのようなオブジェクトで自動的に解放されては困る場合はretainを呼ぶ。
3.alloc、new、copyで始まるメッセージで生成したオブジェクトを自動的に解放したいならautoreleaseメッセージを送る。
4.retain、releaseは参照カウントを即座に増減させるが、autoreleaseは遅延して参照カウントを減らす。
を発見するに至るわけです。
たいがい、このルールを破った事でハングアップしてるわけですよ。
ということで、やれやれretain問題は一段落なんだけど、retainしたらreleaseしないといけないわけで、Chapter-2でretainしたNSStringオブジェクトは最終的にリークしちゃうわけです。
これがChapter-5のテーマ
いかにしてメモリリークをみつけるか
に繋がっていくわけですな。
instruments
ですよ。「iPhoneアプリ開発、その(161) 俺はInstrumentsでいくぜ」でも使ってるけど、Chapter-5ではChapter-2のメモリーリークをInstrumentsを使って調査していくわけです。
で、見つかった場所が
cell.textLabel.text = columnTitle;
なんだけど、当然これtがChapter-6の呼び水になるわけですな。
ドットってなんだよと。
cellはUITableViewCell*なんだからオブジェクトのポインタのはずで、ドットなんかでtextLabelと結べるわけねーじゃんとC/C++経験者の疑問にChapter-6では
Objective-C 2.0 プログラミング言語
を引用しながら答えを探していくわけです。で、このドット構文を調べていくと必然的にぶつかるのが@propertyでして、この2つの機能をChapter-4同様、実験用のクラスを定義してコンソールを駆使しつつ実践で確認していくわけです。
まあ、これでサンプルソースを読む上で重要な知識、ドット構文、@propertyを得るわけですが、この確認作業でちょっとした事件がおきるわけです。
というのもUILabelのtextの@propertyはcopyのはずなのに、Instrumentsではcopyではなくretainが呼ばれてる事がわかるんですわ。
なぜだ?と
これにはNSString、NSMutableStringの違い、そしてポリモーフィズムによるしかけが炸裂してるわけで、これをプログラムで試しながら検討していくわけです。
そしてポリモーフィズムを使った、iOSで最も有名な機構がデリゲートデザインパターンというわけで、それは何だとChapter-7へとなだれ込んでいくわけです。
続く。