1月2010

iPad は一般消費者向けのデバイスだと思います

タイトルの通り、 iPad は私のように毎日パソコンに張り付いているような人々のためのデバイスではなく、パソコンとあまり縁のないような人々のために作られたデバイスだと思います。

パソコンは、汎用的なデバイスすぎて、ただネットを見たいという一般の方々には、少々高価でありオーバースペックであり複雑で使いにくいものだと思います。そんな方々にとって、 iPad は理想的なデバイスに見えるのではないのでしょうか?

マルチタスクできないと不満を漏らしている上級ユーザーさんがいるようですが、一般のユーザーに対して、本当にマルチタスクを提供する必要はあるのでしょうか?マルチタスクという機能さえわかっていない人々は、たくさんいると思われます。

Flash非搭載というのは、よくわかりませんが。あとから対応させて、話題を誘うためのだったらいいですね。

そんなわけで、私はあまり iPad は欲しくありません。 iPhone で十分です。ただし、ネットをやりたいけどパソコンがわからないと言っている、身近な方々に、ぜひお勧めしたいデバイスとなることでしょう。

ガベージコレクションについて

積極的に利用すべきものであるのに、未だに利用していない機能、第二弾、ガベージコレクションです。

多くの読者は、すでに分かっていると思われますが、ガベージコレクションの有無を選択できる言語など、そう多くはないはずで、私の場合 Objective-C のことを指しています。 Objective-C は 2.0 から、ガベージコレクションがサポートされ、ガベージコレクションを有効にすることで、参照カウンタ方式の古典的な煩わしいメモリ管理から解放されます。

パフォーマンスに問題がなければ、積極的にガベージコレクションを有効にすべきと考えていますが、なぜか私はまだ導入していません。

1つ目の理由は、 iPhone OS ではガベージコレクションが使えないからです。一度ガベージコレクションに慣れてしまうと、参照カウンタ方式のメモリ管理に戻ったときに、感覚を戻すのに時間がかかりそうなので、そのときのことを考えて、 Mac OS X 向けのアプリケーションであっても、ガベージコレクションを無効にしてプログラムしています。また、その理由に近いのですが、ガベージコレクションを有効にすると、 Leopard 以前の OS X ではアプリケーションを動作させることができなくなってしまいます。まだ Tiger ユーザーのことも考えてあげてもいいかなと思っています。

2つ目の理由は、 Objective-C に限らない話なのですが、ガベージコレクションを使ったとしても、リソースの管理はつきまとうわけで、ガベージコレクションで曖昧なメモリ管理をしていると、リソースの管理も同時に曖昧となってしまわないかという不安です。ガベージコレクションが有効なプログラミング言語で、あまり長いプログラムを書いたことがないので、実際どうなのかわかりませんが。

というわけで、まだガベージコレクションを活用していないのでした。

retain と copy の使い分け方

Objective-C のメモリ管理やオブジェクトのオーナーシップは、Objective-Cを始めるプログラマにとって、少なからず理解に苦しむこともあるようですが、今回はある程度理解したプログラマ向けの、 retain と copy の使い分け方を書こうと思います。

実は、この retain と copy の使い分け方は、Cocoa基礎ガイドにも載っています。

copyとretainの使用面における違いは、前者の場合、新しい所有者による単独使用のためにオブジェクトが要求されることです。新しい所有者は、コピー元に関係なく、コピーしたオブジェクトを変異させることができます。通常、オブジェクトを保持するのではなくコピーするのは、オブジェクトが値オブジェクトの場合、つまり何らかのプリミティブな値をカプセル化している場合です。このことは、オブジェクトがNSMutableStringなどのように可変(変異可能)の場合に特に当てはまります。不変オブジェクトの場合は、copyとretainは同等になる可能性があり、同じように実装される場合があります。

Cocoa Fundamentals Guide – Cocoaオブジェクトのライフサイクルより引用

これで理解できれば苦労はしませんが、なんとなくわかりにくい文章ですね。簡単に retain と copy の使い分け方を書けば、次のようになるでしょう。

オブジェクトを値として扱っているようなときは、copy を使用します。それ以外の場合は、retain です。これに当てはまらない例外も存在します。

コピーの発生しない retain を使ってオブジェクトを保持した方が、パフォーマンスがよくなると思って、retain を使用した方がいいと思っている方もいるでしょう。しかし、これは間違いです。オブジェクトを値として見る場合には、copy を使いましょう。オブジェクトを値として見るというのは、具体的には、NSString, NSNumber, NSValue などといったオブジェクトのことです。

これらのオブジェクトは、文字列や数字といった値を表すオブジェクトです。なので、オブジェクトがこれらを保持したい場合には、当然その値を保持したいわけです。しかし、Mutable なオブジェクトの存在を忘れてはいけません。NSString には、NSMutableString が存在し、値の変更を許すオブジェクトがあります。

ここに、NSString オブジェクトを保持する setter を考えてみましょう。 retain の場合、NSString オブジェクトが渡されれば、全く問題はありません。しかし、NSMutableString が渡されたことを考えると、保持している文字列が、どこかで変更されてしまう可能性が出てくるのです。一方、 copy の場合を考えてみましょう。こちらの場合は、インスタンスを複製して保持するので、たとえ渡されたインスタンスが NSString であれ NSMutableString であれ、確実に文字列を保持することができます。

逆に、copy してはいけないオブジェクトもあります。こちらの方がわかりやすいと思いますが、NSWindow などといった、値が欲しいわけではなく、その参照に注目したいときです。 copy してしまうと、NSWindow が二つできてしまうので、このようなインスタンスを copy してはいけないことは、すぐにわかると思います。

基本的に、これらのルールで retain と copy を使い分ければ良いのですが、 NSData や NSImage といった、どちらを使うか迷うようなオブジェクトもあります。私の場合、これらのオブジェクトは、copy にコストがかかるので、retain にする場合が多いのですが、NSData に関しては、NSMutableData も存在するので、注意が必要でしょう。

最後に、例外として、どちらも使わない場合があります。 デリゲートを保持するときは、 retain を使わずに、単純代入、つまり assign 使います。なぜならば、デリゲートオブジェクトを保持してしまうと、多くの場合循環参照に陥ってしまって、メモリリークを起こしてしまうからです。この他にも、循環参照には注意する必要があり、このようなケースに陥るときには、 retain を使わないようにしなければなりません。

参照カウント Wikipedia

例外処理について

これから数回、プログラミング言語の機能で、積極的に利用すべきものであるのに、未だに利用していない機能でも語っていこうと思います。第一回は例外処理です。

プログラミング言語の機能として、例外処理というものがあります。オブジェクト指向プログラミングを取り入れたプログラミング言語によく見られる機能であり、エラー処理を簡単に記述したり、エラー処理忘れを防止できたりする機能です。また、例外処理では、エラーの詳しい情報も取得できます。

しかしながら、私は本格的に例外処理機能を使ってプログラムを組んだことがありません。何故かと言えば、単純に例外処理を導入するのが面倒なのもありますし、ライブラリが例外処理に対応してなかったりすると、そこに例外処理を入れてしまうと、何か中途半端となってしまうからです。

Javaのように、例外が積極的に使われているどころか、無視することができない場合は、積極的に例外処理を利用しますが、特別例外処理を必要とせずとも、プログラムすることの出来る場合は、例外処理を使おうとは思いません。むしろ、先に述べたことの繰り返しとなりますが、既存のライブラリなどが、例外処理を使っていない場合、使っているコードと使っていないコードを混在させるのは、何か気持ち悪くてできないのです。

というわけで、特にパフォーマンスが気にならなければ、積極的に例外処理を使ったコードを書くべきだとは思っているのですが、なかなかそのようなスタイルが身につきません。

あと、個人的な話としては、例外処理をやるとtry-catch-finallyでインデントが1つ増えてしまって、コードのインデントがやけに多くなってきてしまうので、そこのところ、どうにかうまい書き方はないのかと思ったりもしています。

Java Applet (笑)

http://ja.wikipedia.org/wiki/Javaアプレット

欠点から項目がはじまるのが残念ですね。

中置記法で書いた式を後置記法に変換し、スタックマシンっぽい命令列に変換したあと、マシンを実行した時のスタックの様子を表した Java Applet

ソースコード: src.zip

なんか作りたいです

既存のアプリケーションもアップデートした方がいいのですが、何か新しいアプリケーションを作成したいですね。何を作成しましょうか。今まで、何かのサービスに依存したようなアプリケーションしか作成していないので、そういうものではなくて、完全なデスクトップアプリケーションを作成したいですね。いろいろとアイデアはあるのですが、なかなか良い落とし所が見つかりませんね。