start

NSArrayとNSTableViewとNSArchiverを学ぶ

どのクラスも、まぁ、その名前の通り。NSArrayは配列を、NSTableViewはテーブルビュー(Winで言う所の、エクスプローラで表示方法を「詳細」にした時に表示されるような形式)を、そしてNSArchiveはデータの保存に関するクラスである。

Windowsに関するプログラミング技法は全然知らないので比較はできないが、とにかくどのクラスも便利過ぎる。「この値を格納しろやー」「このデータを『商品名』フィールドに表示してくれやー」というメッセージを、それぞれのインスタンスに送るだけで、きっちりと期待通りの動作をしてくれる。

何より凄いのが、NSArchive。各オブジェクトに -encodeWithCoder: プロトコルを実装してやれば、保存したいオブジェクトに含まれる、別のオブジェクトまでを全て一発で保存してくれる。そうやって保存したデータの読込みは、NSUnarchiver クラスで一発OK。面倒な保存/読込み処理を、これらのクラスに丸投げできて、非常に便利便利。

前回のNSSoundとあわせて、簡易サウンドプレーヤを作る為の材料は、これで揃った。あとは実際に製作に取りかかるのみだ。頑張るぞー!!

メソッドのポインタ

Objective-Cのメソッドのポインタを取得して、メソッドをCの関数として呼び出す事が出来るのだとか。

// イニシャライズ
id obj = [Hogehoge new] ;
// メソッドのセレクタ取得
SEL method = @selector(methodOfHogehoge);
// セレクタからメソッドのポインタ取得
IMP func = [Hogehoge instanceMethodFor:method];<br />
// 関数としてメソッド methodOfHogehoge を実行
func(obj, method); 

肝となるのは、instanceMethodFor: メソッド。こいつがセレクタ(メソッドの内部識別子)から、メソッドのポインタを探し出してくれる。その返り値を、IMP型で受け取るとあら不思議、Cの関数呼び出しの形でObjective-Cのメソッドが実行できちゃった。ただし、引数として元のメソッドが含まれるオブジェクトのインスタンスと、メソッドのセレクタを渡してやらないといけない。

とりあえずObjective-Cの勉強は一段落したが、俯瞰してみるとObjective-Cが「Cの枠組みの中でオブジェクト指向を目指した言語」であるということがよくわかる。そのお陰かCの流れを汲んだオブジェクト指向言語であるC++と比べて、言語規模は格段に小さい(と思う)。

表記方法がかなり特殊ではあるが、初心者がオブジェクト指向を学ぶには、Objective-Cは結構いい言語なのでは?と思ったりした。

iPod nano発売!

かねてより噂されていた、新型iPodが発表&発売された。その名も「iPod nano」。2GB/4GBのフラッシュメモリとカラー液晶を搭載し、従来のiPod mini枠の置き換えを計った、超小型のiPodだ。

その大きさたるや、90x40x6.9(mm)!! 手持ちの3G iPod(20GB)の実寸が100x60x15(mm)なので、面積的には一回り、厚さ的には1/2近く小さい。

「iPodは持ってるけど、シリコンオーディオプレーヤが欲しい。でもshuffleじゃ容量的にも操作性的にも厳しいし……」と思っていた人(俺)には、まさに最適解となる製品である。いやー、appleはわかっていらっしゃるw

ただ、首からぶら下げての使用を想定してか、ヘッドフォンジャックが本体下部、Dockコネクタの脇に付いているのは戴けない。胸ポケに入れて使用する場合は、どうするのであろうか。使用するヘッドフォンのコネクタがL字型であれば、さほど問題にもならないだろうが、垂直タイプ(従来のiPodに付属のイヤホンもこのタイプ)だと、上下逆さまにしないと使えないと思うのだが……。数日もすれば、その辺の使い勝手も、次第に明らかになっていくとは思うが。

個人的にはiPod Camera Connectorが使えるのかも気になる。これが使えれば、iPod nanoを広大なカメラストレージとして使うことができるから。

iTunes5も本日付けで公開された。見た目のデザインがTiger風味に変更され、検索機能がより強化されたのが特徴。

20050908-01.jpg

で、この新検索を使ってみて気づいたのが「ビデオ」という、絞り条件があるということ。

さらっと試してみた所、MPEG-1とPSP向けに作ったMP4ファイルが普通に取り込めた━(゚∀゚)━! 。残念ながら試した限りではAVIは取り込めなかったが、もしかしたらWindows版では取り込めるのかも。もちろん、取り込んだ動画は、他の曲と同じように扱える。

こうして、わざわざビデオ機能を包含するということは、iPodがビデオ再生機能を取り込む日も近い!?

他にも、AACがVBRに対応したり、曲ごとに「再生位置を記憶」できたり、歌詞に対応したりと、地味だけど何気に機能が底上げされている。

128kbpsのVBR-AACとCBR-AACで比較してみたところ、スペクトラム的には高域が出ているようだ(聴き比べはしてないので、音質に関しては不明)。ファイルサイズも、若干ではあるがVBRの方が抑えられている。VBRというよりは、ABRに近い感じだ。

「再生位置を記憶」は、従来はファイルの拡張子を、m4aからm4bに変える事で裏技的に利用できた機能であったと思う。普通の曲では使いどころが難しいと思うが、まぁ、それは人次第だろう。

何はともあれ、ここの所のappleは、とかく絶好調ですな。iPod nano、凄く欲しいぞ。

イニシャライザの返り値

サンプルソースを見ていると、各クラスのイニシャライザは

return self;

obj = [super init]
...
return obj;

というコードで、自身を返している。うーん何でだろう?

わが師匠し~くる氏に聞いてみたところ、

[hogeHoge alloc];
[hogeHoge init]

[[hogeHoge alloc] init]

と短縮して書ける。そして「親クラスのイニシャライズが成功したか否かの判別に使う」とのこと。

ふーむ、最初の用途は簡単に理解できる。[hogeHoge alloc] が自身(self)を返すから、[[hogeHoge init] alloc] = [self init] = [hogeHoge init] ということが言える。

でも、親クラスのイニシャライズの判別は、ちょっとわからない。なぜ、self にスーパークラスの返り値を入れることで、判別できるのだろう……?そもそも、親クラスのイニシャライズの成否を調べる場面が、今は思い浮かばない。

まぁ、ボチボチ調べていくことしますか。

(2013-04-10 追記)
今読み返してみると、内容が完全に「日本語でおk」な件。当時の俺は何を考えていたんだろう…。

GNU版Objective-Cのコンパイル

GNUのObjective-Cランタイムを使ったソースをコンパイルするには、gccに「-lobjc」オプションが必要。

最初、これがわからずに「『Object』なんてクラスしらねーよ」って、リンカに怒られてた('A`)。

  • start.txt
  • 最終更新: 2022-07-27 15:26
  • by Decomo