2010年6月26日土曜日

[Objective-C]プロトコル メモ書き

プロトコルはJavaでいうところのinterfaceだと思います。
説明としては、「実装が期待されてるメソッドの定義集」って感じでしょうか。

でもこの代理人の証さえあれば、 自分のメソッド内から呼び出したUIAlertViewのdelegateを自分自身(self)にすることで、ユーザーの反応結果を受け取ることができます

プログラマメモ2

autoreleaseとrelease

リリースのタイミングなどについて

・何回も繰り返されるループの中で、ローカル変数に対してautoreleaseを使うことは避ける
・autoreleaseを使ったコードを何度もループせざるを得ない場合には、NSAutoreleasePoolで適切な頻度で解放する


autoreleaseを使うと本当に遅くなる?という疑問を実測しながら検証中です

メモリ管理



UIImage* img1 = [[UIImage alloc] initWithContentsOfFile:imgPath1];
UIImage* img2 = [[UIImage alloc] initWithContentsOfFile:imgPath2];
NSLog( @"A cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = img1; //img1はここでretainされる
NSLog( @"B cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = img2; //im1はrelease img2はretainされる
NSLog( @"C cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = nil; //img2がreleaseされる
NSLog( @"D cnt %d %d\n", img1.retainCount, img2.retainCount );
[img1 release]; //ここでretainCount 0となり解放(dealloc)される
[img2 release]; //ここでretainCount 0となり解放(dealloc)される

==========出力結果========================
A cnt 1 1
B cnt 2 1 ←セットしたimg1がretainされてる
C cnt 1 2 ←img1はreleaseされ、セットしたimg2がretainされる
D cnt 1 1 ←img2がrelease、両方ともセットする前に戻る
セットしたオブジェクトの参照を解きたければ、nilをセットするとよい。(セットした先のクラスがreleaseの面倒までみてくれる)


参考文献iPhoneSDK + ObjectiveCにおけるメモリ管理のはまりところ

2010年6月25日金曜日

用語メモ

忘れやすいのでメモ

ガベージコレクション・・・プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能である。「ガベージコレクション」を直訳すれば「ゴミ収集」となる

アトミック・・・プロパティへのアクセスがスレッドセーフであるという意味

スレッドセーフ・・・あるコードがスレッドセーフであるという場合、そのコードを複数のスレッドが同時並行的に実行しても問題が発生しないことを意味する。

アクセサメソッド・・・オブジェクトの状態を取得または設定するインスタンスメソッドです。Cocoaの用語では、オブジェクトの状態を取得するメソッドを「getアクセサ」または「getter」、オブジェクトの状態を変更するアクセサを「setアクセサ」または「setter」と呼びます。「インスタンス変数にアクセスするメソッド」

プロパティ

この自動的に付けられる名前以外に、自分で名前を指定することもできる。そのために使われるのが、属性のgetterおよびsetterだ。getterは読み込み、setterは書き込みのためのアクセサの名前を指定する。次のように使う。

@property (getter=isEnabled, setter=makeEnable:) BOOL enabled; 

getterメソッドは、引数はなしで、プロパティの値を返すもの。setterメソッドは、プロパティの型の引数を1つ取り、返り値はvoid型になるものになる。注意してほしいのは、setterは引数を取るので、最後にコロンを付けておかなくてはいけないことだ。Objective-Cでは、引数は必ずコロンの後に来る。このコロンを忘れると、コンパイルが通らない。




参考文献ダイナミックObjective-C

2010年6月17日木曜日

パースの時のメモ

[[NSString alloc] initWithData:xml encoding:NSUTF8StringEncoding];