Mac用アプリを作る#02

Mac OS X Cocoaプログラミング 第三版
Mac OS X Cocoaプログラミング 第三版

posted with amazlet at 11.08.13
Aaron Hillegass アーロン ヒレガス
ピアソン桐原
売り上げランキング: 53448

 

やっぱ、一つの言語をまともに使えるようになるまでは時間かかるなぁ。
まだ先は長い・・・

今回も上の本読みながら進めているけど、Tipsというか疑問の列挙になってしまった。

allocとinitって何が違うんだ?

allocはインスタンス作成。newと一緒だな。initは初期化となっている。意味わかんないね。newしただけじゃ使えないってことか。
initはレシーバの初期化らしい。なんだろ、レシーバ。

NSLogはc#のstring.Formatと似たようなものだな

%@はオブジェクトの中身表示らしい。toStringと一緒か。
オブジェクトのdescriptionメソッドが呼ばれるらしい。
だから、c#で文字列の所に%sとかしておいて、値の方でhoge.toString()と指定した感じになるということね。Objective-Cでは、文字列に%@として、値の方はhogeのみを指定という感じになる。便利かもね。

@はエスケープじゃないよ

@もc#のようなエスケープかと思ったら、cの文字列ではなくOjbective-Cの文字列を表す記号らしい。

C言語の文字列ではなく、NSString型として扱うという指定か。なるほど、元がCなだけに、ここら辺はJavaやC#のように文字列はすべてString型だ!とは出来なかったのね。
Cの資産(ソース)をそのまま活かすことの方がメリットあったってことなのかね。

デバッグとリリースの切り替えがよくわからん

Product - Edit Schemeの中にはReleaseになっているのがArchiveというのがある。Product - Build For - Archiveとしてみたが、どこに何が出来たのかよくわからん。
ここで切り分けるのかね。

null exceptionはない?

nilにメッセージを送っても無視。コードはすっきりするだろうけど、いいのか悪いのか。

この本、せめてc#、javaがわかっている人向きだな。普通になんの説明もなしにオーバーライドとか出てくる。
cは本当にかじった程度でなんとかなりそう。

で、Null Exceptionはないかというと、そうでもないような感じがする。それはまた先に確認する。

文字列の比較はisEqual

これはJavaと同じ。c#みたいに==をオーバーライドすればいいのに。

NSArrayにはnilは入れられない、へー

でも、NSNullというクラスがあって、それは入れられる。ややこしい。
たぶん、システム側の都合だろうな。
そして、変更できない。immutable。
Mutableとなっているクラスは変更できるもの。

*ってなんだっけ?

  • (void)prepareRandomNumbers;
  • (void)setEntryDate:(NSCalendarDate )date;
    上はいいとして、下のNSCalendarDateの後の
    はなんだっけ。ポインタ型の場合はつけないといけないんだっけ?

srandとsrandomに違いはない?

互換性の為にどちらもあるとのこと。C言語の関数らしい。嘘だったらごめん。

補完機能の使い方

引数が複数あるメソッドは引数を入れて、tabを押すと次の引数にジャンプする

メソッドの前が+のものはクラスメソッド

c#でいうstatic(だったっけ?)
javaでいうthisはself

指定イニシャライザ

実際に処理を行うイニシャライザ。C#でいうオーバーロード的なことをやると、内部では引数をたくさん受け取るメソッドが実際の処理を行う事が多いはず。それを指定イニシャライザというみたい。
NSObjectの指定イニシャライザはinitだそうだ。

デバッグ

20110821xcode01

これが呼び出し階層?

20110821xcode02

上の飛び越えるような矢印がステップ実行。
再生マークは次のブレークポイントまでジャンプする

ソースがないオブジェクトもデバッグ

シンボリックブレークポイントというのを追加しないといけない

20110821xcode03

ここでプラスを押す。

20110821xcode04

symbolにobjc_exception_throwを追加
これでひっかけられる。

DebugとReleaseの切り替え

20110821xcode05

ここの青いアイコンをダブルクリックするとそれらしいものが出てくるが、なにやら面倒。
どうも、リリース時はビルドの仕方をArchiveを指定してやるようになったみたいなので、いらないのかも。
未調査です。

動的メソッド追加

NSObjectにはisaというインスタンス変数がある。これはクラス定義構造体を差している。クラス構造体にはなんのメンバーが含まれているか書いてあるので、isaをたどればクラスの定義がわかる。
メソッドが呼び出させれると、その中をスーパークラスまでたどって該当メソッドを見つける仕組み。シンプルだなぁ。
NSBundleというクラスは動的にメソッドを追加できるものらしい。

xcode4への移行

http://sazameki.jp/translations/xcode4/IDEs/Conceptual/Xcode4TransitionGuide/Orientation/Orientation.html

mファイルを開いたときに関連するヘッダファイルを開く

20110821xcode06

アシスタントというのがそれらしい。
xlb開いても関連するヘッダが出る。これは結構便利。

ガーベージコレクションを有効にする

これもXcode3の時と場所が変わっているらしい
プロジェクトをダブルクリックした画面にありました。

[2012/03/04追記]

下の画像のオプションはいつのまにかなくなって「Automatic Reference Counting」という別の仕組みにに変わっています。検索窓でgarbageで検索してもヒットするようにはなっているみたいです。ARCについてはこちらに説明がありました。

20110821xcode07

 

うわーメモリ管理面倒

allocした際に参照カウントは1になる。
returnでポインタを返したい場合、返す前にreleaseしてしまうとnilが返ることになってしまう。
そのためのautoreleaseメソッド。これやっとくと、イベントループ終了時に解放される。
これ面倒だからクラスによってはオートリリース用のプールに入れた状態でオブジェクト返すメソッドが別に用意されているものがある。

プロパティーも面倒。c#でいう参照型だと、もらったポインタをretainして、古い参照をreleaseして、インスタンス変数にもらったポインタを入れる必要がある。
なんでretainするのか?
それは、もらったポインタがautoreleaseプールに入れてられているかもしれないから。
参照カウンタ1、かつ、autoreleaseプールに入れられて渡されてきたものを、そのままセットしたらいつのまにか消えてしまうことになる。
だからretainする。めんどいね。
渡す側でretainすればいいんじゃないかと言う気もするけど、それはそのクラスを使う側からするとめんどくさいことになってしまうので、クラス側でやるべきということなんだろうね。

というか、渡す側も元々どっかからautoreleaseに入れられてきたものを取得しているかもしれないので、retainして使うことになるはず。で、呼び出し元で責任もってreleaseするようにしないといけない。
おのおののクラスでretainしたらreleaseしないいけないってことだな。

ガベージコレクションって偉大だな。

xlbを最初に開いたときはウィンドウを一回クリック

そうしないと、ウィンドウ自体がデザイン画面に出てこない。ウィンドウの上にボタンなどはドロップしないといけない。
なんで、最初からウィンドウ出てこないんだろう・・・

最初にフォーカスが当たる部分を指定

ウィンドウをcontrol + クリックして、initialFirstResponderをフォーカスさせたいコントロールにドラッグ。
なんでも、メッセージなんだな。c#とかだったらプロパティになってそうなところだ。

ファイルの後ろに付いているAとかMってなに

AddとModifyの略。Gitにコミットしてから、追加になったファイルか変更になったかを表している。

mファイルを移動させるとクラッシュ

なぜかわからんけど、mファイルが変なところに出来たので移動させたらxcodeクラッシュ。何回やってもクラッシュ。放置だ!

ボタンが反応しない!

単純にボタンから線をクラスにひっぱってなかっただけだったりする。

今日のショートカット

control + cmd + j 定義へ飛ぶ
control + cmd + ← 元の場所へ戻る
デバッグ実行はコマンド + R
cmd + n 新規のクラス追加

まったくまとめる気無し

いつになくまとめる気もなく、だらだらと気づいたりはまった点を順不同で書いてみた。
わかりづらくてごめんなさい。