2008-12-20

荻原(2.0)本

追記@2010-12-19

2010年12月に改訂版が出た。改訂版の目次も引き写しておいたので、以下を参照のこと。

何度も言及しているので、目次だけでも参照できるように書き込んでおく。

詳解 Objective-C 2.0 ([著]荻原剛志, [版]SoftBank Creative)

詳解 Objective-C 2.0
荻原 剛志
ソフトバンククリエイティブ ( 2008-05-28 )
ISBN: 9784797346800
  • CHAPTER 01. オブジェクトに基づくソフトウェアの作成
  • CHAPTER 02. Objective-Cのプログラム
  • CHAPTER 03. 継承とクラス
  • CHAPTER 04. オブジェクトの型と動的結合
  • CHAPTER 05. リファレンスカウンタを用いたメモリ管理方式
  • CHAPTER 06. ガーベジコレクション
  • CHAPTER 07. NSObjectクラスとランタイムシステム
  • CHAPTER 08. Foundationフレームワークの重要なクラス
  • CHAPTER 09. カテゴリ
  • CHAPTER 10. 抽象クラスとクラスクラスタ
  • CHAPTER 11. プロトコル
  • CHAPTER 12. 宣言プロパティとアクセサ
  • CHAPTER 13. オブジェクトのコピーと保存
  • CHAPTER 14. メッセージ送信のパターン
  • CHAPTER 15. アプリケーションの構造
  • CHAPTER 16. 例題: 簡易画像ビューア
  • CHAPTER 17. 例外とエラー
  • CHAPTER 18. スレッド
  • CHAPTER 19. 分散オブジェクト
  • CHAPTER 20. キー値コーディング
  • Appendix A: Foundationフレームワークの概要
  • Appendix B: コーディングの指針

ゾーンについて調べてみた

ヒレガス本を読んでいた。ちょっと気になることがあって ADC Documents の中の "Cocoa Fundamentals Guide" を開いた。そこで、"zone" という言葉に出会う。「ああ、そう言えば "allocWithZone" とか見たことあるな。ゾーンって何(・ω・)?」と思ったので、荻原(2.0)本を開いた。「CHAPTER 13. オブジェクトのコピーと保存」の最初にゾーンの解説が載っている。軽く引用してみる:

(p.304)
Cocoa では、動的に確保されるメモリの管理をゾーン(zone)と呼ばれる領域を使って行います。(・・・中略・・・) メモリ空間にいくつかのヒープを設けて、関係の深いデータやオブジェクトは特定のヒープからメモリが割り当てられるようにします。このようにすると、空間的な局所参照性を生かした効率的なメモリアクセスを実現できると期待されます。

ページフォールトを避けたい、ってこと何だろうねえ。何というか、C の時代に戻ったような気がするよ。と思いつつ先を読み進むと・・・

(p.305)
Apple社のドキュメントでは、通常はデフォルトゾーンだけの利用で十分な実行効率が得られるとされており、(・・・中略・・・) さらに、ガーベジコレクションを利用した場合には、オブジェクトを生成する時にゾーンを指定することができません。

ええええ??

しょうがない、英語と格闘するか。と ADC Documents にもどって、ゾーンに関する記述を探した。荻原(2.0)本には "Objective-C 2.0 Runtime Reference"、"Memory Management Programming Guide for Cocoa" の名前が挙がっている。

"Memory Management Programming Guide for Cocoa" にこう書いてあった。

Zones are page-aligned areas of memory that hold the objects and data allocated by an application. (・・・中略・・・) In most circumstances, using the default zone is faster and more efficient than creating a separate zone.

(・・・中略・・・) For example, allocating a group of related objects in the same zone co-locates those objects in the same area of memory. If a page fault occurs when trying to access one of the objects, loading the page brings in all of the related objects, which could significantly reduce the number of future page faults.

たいていはデフォルト(ランタイムシステムが自動的に割り当てるゾーン)だけで十分だ。一方で、独立したゾーンを使うと、メモリのフットプリントが大きくなる代わりに、ページフォールトが減らせるかもよ、とも書いてある。

"Garbage Collection Programming Guide" では、つぎの一文を発見。

You cannot allocate objects in separate zones—all Cocoa objects must be allocated in a single managed heap. If your application is running in garbage collection mode, the zone parameter in NSAllocateObject is ignored.

GCが有効だと、ゾーンを指定しても無視される、と。

まとめてみよう・・・。Mac で、それも Leopard 以降だけをプラットフォームとするなら、GC を使えるし、使いたいだろう。その場合、ゾーンのことは忘れて OK。けど、iPhone OS では GC は使えない。しかもメモリやパフォーマンスはシビアなプラットフォームだから、ゾーンを使ったプログラミングが関係してくるかもしれない。

2008-12-14

"Beginning iPhone Development" が届いた

今日、Amazon から届いた。

表紙の輪切りフルーツは何? 裏表紙を見ると関連するタイトルで同様の柑橘系フルーツの輪切り写真が使われていて、レモン、ライム、オレンジのように見える。とすると、この iPhone のやつは・・・。

それはさておき、まずは目次。

  • CHAPTER 1 Welcome to the Jungle
  • CHAPTER 2 Appeasing the Tiki Gods
  • CHAPTER 3 Handling Basic Interaction
  • CHAPTER 4 More User Interface Fun
  • CHAPTER 5 Autorotation and Autosizing
  • CHAPTER 6 Multiview Applications
  • CHAPTER 7 Tab Bars and Pickers
  • CHAPTER 8 Introduction to Table Views
  • CHAPTER 9 Navigation Controllers and Table Views
  • CHAPTER 10 Application Settings and User Defaults
  • CHAPTER 11 Basic Data Persistence
  • CHAPTER 12 Drawing with Quartz and OpenGL
  • CHAPTER 13 Tabs, Touches, and Gestures
  • CHAPTER 14 Where Am I? Finding Your Way with Core Location
  • CHAPTER 15 Whee!
  • CHAPTER 16 iPhone Camera and Photo Library
  • CHAPTER 17 Application Localization
  • CHAPTER 18 Where to Next?

2008-12-13

iPhone SDK (OS 2.2用) にアップデート

MacBookの方の Xcode、っていうか iPhone SDK をアップデート。iPhone OS 2.2 対応のもの。Xcode は 3.1.2。インストールにかかった時間は約10分。

送信者 iPhoneをプログラミング

2008-11-29

MindNode Pro を使うことにする

FreeMind はファイルの拡張子に「.mm」を使う。これは Objective-C++ 用として Xcode にひもづけられている。気に入らない。「.mmap」とかに変えると、今度は FreeMind が開けないと文句を言う。むかつく。立ち上げた後、ファイルを開こうとするとダイアログはデフォルトが「.mm」でフィルタリングされている。いちいち「All Files」に変えないと他の拡張子のファイルを探せない。イライラする。

他のソフトを探してみることにした。「mac mindmap」でグーグルさんに聞いてみると、すぐに MindNode というソフトが見つかった。まだ新しいソフトのようだけど、評判も良さそう。

公式サイトを開く( MindNode >> MindNode Pro )。フリー版がある。試してみた。うん、なかなかイイ感じ。あれ、ノードの移動ができないぞ。むむむ、カット&ペーストしろっていうのか? ほほお、それは Pro 版(有料)ならできるのか。いくらいくら? 11.95 ユーロって・・・(だいたい¥1,500.-ぐらいらしい)。そこまで言うなら買おうじゃないか。PayPal でお支払い。

こんな感じ(↓)。

送信者 Macをプログラミング

2008-11-24

Power Mac にメモリ増設

Power Mac G5 にメモリを増設した。少し前から、2GBだと少しキツいな、と思い始めていた。ブラウザ(Firefox と Safari)、メールに iCal、iTunes、iPhoto。Omni系のアプリが加わることもある。これでもういっぱいいっぱい。アクティビティモニタで「システムメモリ」を見ると緑の部分(空き)がほとんど残らない。というか、すでにページアウトが増えている状態。ここから Xcode を起動すれば、その分がそのまま他を押し出すことになる。

で、思い切って買ってみることにした。ちなみにうちの Power Mac は G5で、Early 2005 って言われているやつ。

増設作業自体は簡単。Power Mac に付属してきたマニュアルに書いてあるとおりにやればOK。スロットは少々、カタく、けっこう力をかけて押し込まなければならなかった。良く見れば、きちんと刺さっているかどうかはわかる。

少しドキドキしながら起動。無事に起動する。ログインして「このMacについて」を表示させると・・・このとおり(↓):

送信者 Macをプログラミング

さらにプロファイラを開いてメモリの項目を見たものがコレ(↓):

送信者 Macをプログラミング

買ったのはコレ(↓):

送料込みで¥6,800.-ぐらい。金曜日(11/21)の夜(ってか深夜)にネットで発注して、今朝(11/24)届いた。素早い発送で満足。次の週末になるかと思っていたからね。

2008-11-08

iPhone SDK をインストールしてみた

送信者 iPhoneをプログラミング

インストールに要した時間は約10分。インストールしたのは MacBook (Early 2008; 黒)。Xcode はインストールずみだったので、上書き + 追加、ってことになる。

インストール完了後、Xcode を立ち上げる。新規プロジェクトを選ぶと、確かに 「iPhone OS」が選択肢に増えている。

送信者 iPhoneをプログラミング

2008-07-30

MacBookが届いた

昨夜(2008-07-29)、20:00ごろに届いた。軽く設定などをやってみた。思い出せるだけ書きとめておこう。

現状

→ Time Capsule で初回のバックアップが完了した。

作業ログ
  • MobileMe に接続完了。
    • Mail.app は MobileMe アカウントのみで使う予定。
  • Firefox インストール完了。
  • AquaSKK インストール完了。
  • Xcodeのインストールイメージ、転送完了。

2008-07-24

MacBook、買ってしまった

2008-07-23の夜、Appl Store で黒い MacBook を発注した。メモリを増設して、キーボードをUSにした。即日発送とはならず、早くて 7/25 発送とのこと。これが Amazon なら翌日に届いたりするんだけどねえ。ともあれ、初の intel Mac だ。

買おう、買おうといいつつ、最後の一歩が踏み出せなかった。最終的な背中を押したのは、直前にヨドバシカメラで実物に触れてみたときに、部屋の PowerBook よりはるかに速い、ひょっとしたら Power Mac より速いんじゃないかと感じたことだ。先週末(7/19)に iPhone を買えたことで調子に乗っているというのもある。

秋に新しい製品が出るんじゃないか、MacBook だろう、なんていう噂もあるみたい(今日、知った)だけど気にしないでおこう。今の黒いヤツの見た目も気に入ってるし(黒地に白のリンゴマークがイイ)。

2008-07-10

新しいキーボード

昨夜、不意に思った(というか決心した)。新しいキーボードを買おう、と。これは前日、急に Power Mac のキーボード(Wireless Keyboardの最初のやつ)のキーが重いと感じたから。しばらく前から Apple 純正のキーボードは何やらアルミっぽい薄型のものに変わっている。なんとなく気になっていたんだ。

純正のキーボードは 2 種類。USB接続のフルキーボードとワイヤレス(Bluetooth)なコンパクトなタイプ。以前からテンキーはいらないと思っていたから、迷わずコンパクトタイプを選びたかったんだけど、問題がひとつ。右側の Control キーがないこと。Emacsもしくは Emacs っぽいキー操作に慣れたものにとって、Control キーが片方にしかないっていうのは重大な問題だ。世の中には Caps Lock の位置に Control があるようなキーボードに慣れている人たちもいるらしいけど、わたしは違う。Control が最下段の両端に2つある(由緒正しい) IBM キーボードに出会って以来、Control は両端にあるべきだと精神と身体が求めている。

同様の悩みは PowerBook を使うときにもあって、こちらも Control は左側にしかない。右側の Command のとなりはなぜか [Enter]。DoubleCommand という最下段のキー配列を変えてくれるソフトがなければ PowerBook を使うのが苦痛に感じられていたかもしれない。

実はこの問題、「システム設定」で対処することができる。というのも現行のコンパクトタイプの最下段の配列(あ、言うまでもなく US 配列だぞ)は、こんな感じ(↓):

[fn][control][option][command][Space Bar][command][option]

右側の[option]が[control]になってくれれば問題ない。それなら「システム設定」で修飾キーの変更ができるのだ。つまり、option と control を入れ替えれば良い。こうすると左側の方も入れ替わってしまうけど、左右対称になってこの方がイイ感じ。

ちなみに、このコンパクトキーボードの配列は現行の MacBook なんかと同じらしい。だから、MacBook を買ったとしても同じ方法で対処できるってこと。

と、問題が解決できることがわかったので、今日、早速、仕事帰りに買ってきた。ヨドバシカメラで¥10,200.-。値段はそれなり。けど、箱が小さいし、薄い。コンパクトタイプとは言え、カバンにすっぽり収まった。

自宅に戻り、箱を開けて中身を取り出すと・・・「小さい!! 薄い!!!」。ビックリした。Bluetooth接続なので単三電池を入れるだけの空間は確保されているのだけど、そのことを感じさせない。まるで机の上に直接キーが並んでいるように錯覚する。今まで使っていたフルサイズのキーボードがやたらデカくて不細工なものに見えてしまう。

小さくて、薄くて、それこそ吹けば飛びそうなのに、しっかりとした重量感がある。机の上にしっかりと固定される感じがある。それもあって机の表面にキーがあるように思うんだよね。

とまどったのは、ファンクションキーの扱いが変わっていることだけ。従来どおりのファンクションキーにするには Fn キーと組み合わせる必要がある。ノートのキーボードと同じになったってことか。

正直、キーの配列(US配列限定)を除けば Apple のキーボードが良いと思ったことはないんだけど、これは良い。現行の MacBook にはほとんど触れたことがないんだけど、キーのサイズやストロークはこれと同等なのだろう。そのうち、気付かない間にモデルチェンジして手に入らなくなるかもしれないから、予備も買っておいた方がイイかも。

2008-06-24

[ヒレガス本]Chapter 4. Memory Management #2

前回より続き。

p.70
配列(NSMutableArray)にオブジェクトが追加されるときにオブジェクトはコピーされない。配列中に保持されるのはオブジェクトへのポインタ。で、そのとき追加されるオブジェクトに retain が送られる。配列が削除(deallocate)されるときに、格納されていた各オブジェクト(へのポインタ)に release が送られる。同様に、配列から要素(オブジェクト)が取り除かれるときにもオブジェクトに release が送られる。

Releaseに関する規則 (p.73)

  • alloc, new, copy および mutableCopy で作られたオブジェクトは retain count が 1 になっていて、autorelease pool には登録されていない。
  • 他のメソッドで作られたオブジェクトは、autorelease されている(retain count が 1)。deallocate されたくないときは retain する必要がある。

アクセサ

他のオブジェクトを保持するインスタンス変数があったとして、その setter をどう書くか。setter に今保持しているのと同じオブジェクトが渡される可能性に対応するため、以下のように書く必要がある。

- (void)setFoo:(NSCalendarDate *)x
{
    [x retain];
    [foo release];
    foo = x;
}

この方法以外にも、release と代入の前に(同じオブジェクトかどうかを)チェックする、あるいは release の代わりに autorelease を使う、というのもある。3つのどれでも良いけれど(それぞれにトレードオフがある)、この本では最初の「retain して release」を選ぶ、と。

これで終わり!!

Objective-C に関する説明はここまで。残りは Cocoa フレームワークに関する話題が中心になる、とのこと。(p.77)

2008-06-14

[ヒレガス本]Chapter 4. Memory Management

メモリ管理に関する章。Leopard 以降の特徴のひとつである garbage collection についての記述が始めに来る(p.66 - 68)。その部分を読んだところ。荻原(2.0)本(CHAPTER 06)では「ガーベジコレクション」となっているけど、ここでは Xcode の日本語表記に合わせて「ガベージコレクション」としておく。

ガベージコレクションについて覚えておくこと - その1

ビルドの設定を変える(p.67)。「必須 (-fobjc-gc-only)」を選べば良い。「サポートあり (-fobjc-gc)」の方は両モードで動けるようなフレームワークだとか、プラグインを作るときに選ぶもの。

そうそう、ここでちょっと驚いたこと。ヒレガス本の p.67 には、ビルドの設定の中から GC に関する項目を探すために「情報パネル」の検索ボックスを使うように書かれている。で、それを日本語環境でやろうとすると検索語も日本語で入力しないと見つけられなかった。「Garbage」では見つからず「ガーベジ」でも見つからず(だから荻原本の記述はちょっとマズいだろ)、「ガベージ」でようやく見つかった。検索ボックスはそういうものなんだとわかれば当たり前だけどね。というか、この挙動の方が直観的か。驚く方がヒネクレているんだろう・・・orz

ヒレガスは GC に完全に頼り切る前に、一通りは従来の方式(リテインカウント方式)も知っておくべきだと言う。以下、その部分を引用。

In the future, you may decide, "This retain-count stuff is for the birds. I'm going to use the garbage collector for everything." I wouldn't blame you. For now, however, learn about the retain-count mechanism. When you study old code or anything that uses lower-level frameworks (such as CoreFoundation), you will want to understand how it works.

古いコードを調べる必要があるかもしれないし、低レベル層のフレームワーク(CoreFoundationなど)を使うことがあるかもしれない。そうなればきっと、従来の方式がどう働くのかを知りたくなるよ、と。

過渡期なんだろうけど、つまりいずれ GC を使わない Cocoa アプリはなくなって、Xcode のオプションもデフォルトで -fobjc-gc-only が付くようになる(むしろコンパイラのデフォルトが変わるかも)。それは言い換えると、プログラマが Leopard より前の OSX のことをサポートしないと決めたとき、なんだけど。「ユキちゃん(Snow Leopard)」が出る頃には Tiger はいなくなっているかね。

ガベージコレクションについて覚えておくこと - その2

オブジェクトへの参照を保持している変数には、そのオブジェクトを使わなくなった時点で、nil を代入する。従来の方式で release するようなものか。これをやらないと、たとえローカルな自動変数であってもそのスコープにいる間はオブジェクトが回収されない。

ガベージコレクションについて覚えておくこと - その3

その3はない。Chapter 4 の残りはリテインカウント方式の解説だ、と。

荻原(2.0)本から拾ってみる

p.125 から引用。

両用が可能なコードを記述するのは大変困難であり、Apple 社のドキュメントでもそのような記述は推奨されていません。どちらのメモリ管理方式を採用するか決めたら、その方式で完全に動作するようにプログラミングするべきです。

「両用」というのは従来のリテインカウント方式と GC 方式のどちらでも動くように作るという意味。

過渡期っていうのは悩ましいね。一部のパフォーマンスに対する要求が厳しいプログラムを除けば GC を使うべきだろう。ただし、その場合 Tiger 以前のユーザを切り捨てることになる。

追記@2008-06-24: 続き

2008-06-09

[ヒレガス本]Chapter 3. Objective-C #2

ヒレガス本、p.44あたりから。

p.45の 「"Inherits from" versus "Uses" or "Knows About"」は、むやみに継承を使うな、という主張。何でもかんでも継承を使いたくなるのはオブジェクト指向プログラミングを覚え始めたときにみんな通る道だよねえ。ともあれ、Objective-C のような動的な言語では継承を使う必要性はほとんどない、とのこと(NSObjectを継承するのは別として)。この本(ヒレガス本)の中で継承はたった2個所しか使ってないゾ、と書いてある。

p.51で LotteryEntry の実装に description メソッドを追加しているけれど、ヘッダの方には宣言を加えていない。これは - (NSString *)description が NSObject で宣言されているメソッドだから。ちなみに、この description メソッドはデバッガでオブジェクトを "print" した際に呼ばれるそうだ(ADC Home > Reference Library > References > Cocoa > Objective-C Language > NSObject Protocol Reference)。デフォルトではクラス名と id 値を表示するだけ(荻原(2.0)本、p.148より)とのことなので、クラスを作ったときは専用の description を書いておくべきだろうね。デバッグしやすいから。

p.56。Cocoa のクラスイニシャライザの中には初期化に失敗すると nil を返すものがある。スーパークラスのイニシャライザが nil を返す場合、nil チェックをして自分も nil を返すべき。

p.57。designated initializer のことは荻原(2.0)本のp.55-56に「指定イニシャライザ」として記述がある。ヒレスガ本のこのページの最後に書いてあるのは、「もし初期化の際に引数が必須となるクラスを作ったら、スーパークラスの指定イニシャライザをオーバーライドして例外をスローするようにすべし」というもの。正しい引数なしにイニシャライザが呼び出されてしまうのを防ぐため。

覚えたこと

@"some text" 記法は 7bit で ASCII な文字しか書いてはいけない。つまり、日本語なんかは書けない。荻原(2.0)本だと p.177 の「オブジェクト定数の文字列」に同様の記述がある。@"..." 記法で書かれた文字列は NSString オブジェクト定数 (a string object constant) になる。

デバッガでオブジェクトの内容を表示させるのは "po" (print-object) コマンド。「内容を表示」といっても description メソッドを呼ぶだけ。

メッセージ送信が働く仕組み

p.62と63にある記述("For the More Curious: How Does Messaging Work?")。荻原(2.0)本だと p.148からの「07-02 メッセージ送信の仕組み」にもう少し詳しく書いてある。

オブジェクト(インスタンス)へのメッセージ送信は、コンパイル時に C の関数呼び出しの形に書き換えられる。

[myOjbect addObject:yourObject];

が、

objc_msgSend(myObject, 12, yourObject);

になる。レシーバーが第1引数、第2引数はセレクタ、以後はセレクタの引数が並ぶ形。上の例でセレクタを 12 という整数値で表しているけれど、これは「例え」であって実際に SEL 型が int だというわけではない。著者は、ほんとうはchar *なんだけど、int と考えると便利だよ、と言っているだけ。荻原本だと、SEL 型に関しては以下のように記述されている:

セレクタが異なれば対応する SEL 型の値も異なり、同じセレクタには必ず同じ SEL 型の値が対応します。Objective-C のプログラマは、SEL 型が具体的にどんな値を持つかについて知っている必要はありません。詳細は処理系に依存します。

このあたりのことは「ダイナミックObjective-C」というネット上のコラムに、もう少し踏み込んだ解説がある。

2008-06-05

[ヒレガス本]Chapter 3. Objective-C

覚えたこと

nil にメッセージを送ると・・・

(p.40)
In Objective-C, it is okay to send a message to nil. The message is simply discarded, which eliminates the need for these sort of checks.

Objective-C では nil にメッセージを送っても良い。単にメッセージが捨てられるだけ。エラーも例外も発生しない。C/C++/Java でおなじみの null チェックは不要だということ。

荻原(2.0)本だとp.62-63にかけて、このあたりの解説がある。ただ nil チェックを書かないことに関しては↓が著者の主張:

ただし、プログラムは簡単になりますが、「nil だった場合に何もしない」という意図が分かりにくくなることは確かです。従って、誤りが混入する危険性も高くなります。

これはおっしゃるとおり。プログラマはいつだって自らの意図をどうやってコードに込めようかと腐心しているのだから、意図を表現できる機会を減らすべきじゃない。っていうか、いろいろパターンを思い浮かべたけど「安全に nil チェックを省略できる」場合が出てこない。さらに、何も起こらないってことは nil にメッセージを送っているってこともわからないわけで、ヒレガス本の言う(p.40)ように「何でメッセージが届かないんだあ!!!」状態に陥りそう。

NSArrayには nil を入れられない

(p.44)
You cannot put a nil in an NSArray.

もちろん、NSMutableArrayでも同じ。これはちょっと意外だった。だから書き留めておく。で、nil が入れられない代わりに用意されたのが NSNull というクラス。使い方は↓

[myArray addObject:[NSNull null]];

さて、今日は p.54ぐらいまでで、時間切れ。夜が短いよ。


追記@2008-06-11:続きはこちら

2008-06-04

[ヒレガス本]Chapter 2: Let's Get Started (さあ、始めよう) #2

前回の続き。

デリゲートって何

荻原(2.0)本」の CHAPTER 14 にデリゲートの説明がある。要は下働きのためのオブジェクトってこと。

デリゲート機構を持つオブジェクトは何か特定のメッセージを受けたときに、もしデリゲートオブジェクトがセットされていれば、そいつに問い合わせたり、処理を任せたりする。このとき元のオブジェクトはセットされているデリゲートオブジェクトが送りたいメッセージを受け取れるかどうかを respondsToSelector:などで調べる。受け取れるオブジェクトならメッセージを送る(つまり、問い合わせたり処理を任せたり)。

デリゲートになるオブジェクトは送られる可能性のあるメッセージすべてに対応する必要はない。対応したいメソッドだけを実装すれば良いことになっている。だから元のオブジェクトは事前に調べる必要があるわけだ。まあ、なんというかデリゲートになる方がエラそうなわけだ。やりたい仕事だけ受け付けます、と。

さて、ここで(前回の)非形式プロトコルが登場する。デリゲートになるオブジェクトは好きなメソッドだけ実装すれば良いという規約なので、通常のプロトコルではまずい。プロトコルを採用するというのはそこで宣言されたすべてのメソッドを実装するっていう意味だから。そのための "ugly" な方法(ヒレガス本より)が非形式プロトコルだったわけだ。Objective-C 2.0 以降はオプション付きプロトコルが導入されて、もう必要なくなった。

2008-06-02

Google Site、作ってみた

作ってみた↓。

以下は、Official Google Blog での告知へのリンク。使い方の動画も貼られている。それを見るとだいたいの感じがわかる。英語だけど操作の様子が映るから問題ない。

[ヒレガス本]Chapter 2: Let's Get Started (さあ、始めよう)

書かれているとおりに手順を追って、RandomeApp を作ってみた。この程度のことは以前にもやったことはあったけど、まあ、それでも実際に手を動かしてみると楽しいものだ。

覚えたこと

Interface Builder で GUI 部品とコントローラなんかのインスタンスを結び付けるときの Ctrl-Drag の方向。メッセージを送る方から送られる方へ線を引く。ボタンなら、ボタンを押したときにメッセージがコントローラに送られるのだから、ボタンからインスタンスへ。テキストフィールドなら、関連づけられたインスタンス変数が変わったときに表示されるテキストが変わるようにしたいのだから、コントローラからテキストフィールドへ。メッセージの方向だと覚えれば良い。

調べたこと

awakeFromNibが気になった。調べてみた。NSNibAwakingという非形式プロトコル(informal protocol)だった。

非形式プロトコルって何?

ヒレガス本(p.297-298)によれば、2.0より前のObjective-Cで、デリゲート・メソッドを宣言するための "ugly" な手段だったということ。

荻原(2.0)本だと、p.272-274あたりに「非形式プロトコル」の説明がある。その最後の部分を引用すると、

従来は上の例のように、メソッド群のすべてが必ずしも必要でない場合、非形式プロトコルで宣言されるのが普通でした。Objective-C 2.0ではオプション付きのプロトコルが使えるようになりましたので、今後はプロトコルの利用が増えてくるものと思われます。

オプション付きのプロトコルって何よ?

プロトコルは Java の interface。荻原本(2.0)によれば Java の方がマネしたとのことだけど、まあそれはどっちでも良い。いわゆる「振舞いによる類型」を実現するための仕組みだ。平たく言うと「インタフェースの共有」ね。

で、2.0 より前の Objective-C ではあるプロトコルを採用(adopt)するとなったら、そこで宣言されたメソッドをすべて実装する必要があった。この仕組みだと先に出てきたデリゲート・メソッドの宣言に使うには都合が悪かったようだ。で非形式プロトコルのような "ugly" なやり方を取っていた、と。

これを解消するためなのかどうかは不明だけど、2.0 からはプロトコルを宣言するときに @optional@required というコンパイラ指定子を使えるようになった。荻原本(2.0)のサンプルを抜き出しておく。

@protocol Alarm
- (void)setCurrentTime:(NSDate *)date;
- (BOOL)alarm;
- (void)setAlarm:(BOOL)flag;
@optional
- (BOOL)snooze;
- (void)setSnooze:(BOOL)flag;
@required
- (void)setTimerAtHour:(int)h minute:(int)m;
@end

プロトコルに適合しているかどうかを conformsToProtocol で実行時にチェックできるのだけど、@optional なメソッドに関してはこれではチェックできない。調べるにはメソッドごとに respondsToSelector: でチェックする。

じゃあ、次はデリゲートって何、ってことを調べようと思ったけど、時間切れ。今夜はここまで。

2008-05-31

ヒレガス本(3rd Ed.)が良い感じ

先週末(2008-05-25)、Amazonからヒレガス本の新版(3rd Ed.)が届いた。

Cocoa Programming for Mac OS X -- Third Edition ([著]Aaron Hillegass, [版]Addison Wesley)

Cocoa Programming for Mac OS X
Aaron Hillegass
Addison-Wesley Professional ( 2008-05-15 )
ISBN: 9780321503619

Prefaceを読んでみたところ英語もわかりやすく、内容もかなり期待できそう。Objective-C 2.0の目玉のGCについても chapterを割いてあるし、Core Dataのchapterもある。「Macでプログラミング」の活動はこの本を読むことを中心に進めていこう。

目次を抜き出すと以下のとおり:

引用集

ブログテンプレートを試すためのテスト用投稿。blockquote用のスタイルを確認するため。まずはプログラマとしての座右の銘を、SICPの序文から引用。

Thus, programs must be written for people to read, and only incidentally for machines to execute.

続いて、プログラマの心得として。"Seven Principles Of Software Development"より第一原理を引用。

A software system exists for one reason: to provide value to its users.

日本語の引用もしておこう。Matzがとても良いことを言っている。すべてのプログラマにとっての光だと言って良い(それぐらい良いコト)。

私はソフトウェアを開発している。私のソフトウェアには価値がある。それがたとえ無料で配布されていても。価値があるソフトウェアには、それからお金を生む方法がある。

プログラミングについて書くところ

目的(goal)

Macを使ってプログラミングすることに関して、丸ごと記録して晒すためのブログ。知ったことや考えたことのメモが中心。

タイトル候補:

  • Macをプログラムする ← 仮採用
  • プログランミングMac
  • Programming Mac

目標(objectives)

  • Macでプログラミングをする記録。
  • Macでプログラミングをするための情報の集積。リンク集。
  • 作ってみたプログラムを公開する場所。
    → プログラム(ソースコード)自体を置くのは別の場所。Google Code や Google Siteになるだろう。

活動(activities)

作業(tasks)のバックログ

  • カテゴリを決める。
  • aboutなエントリを書く。