ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2011年6月13日月曜日

ObjCのプロトコル



簡単にレガシー調で言うと、受信コマンド一覧。なんだそういうことか。わかりやすい。やはりこの通信している感がいい。だがMVCはどうも馴染めない。Viewというと、そんなに普遍的なものではなくて、むしろ機種依存的な要素が入ったりする、ハードウェア寄りなイメージがある。だから、Viewがなくてもいい、というところから始まって、その上に必要に応じてView的なオブジェクトを系(システム)に追加する、という考えをベースにしたい。

例えば文字列を選択してコピーした場合、文字列の文字コードがコピーされる気がするが、実際には状況によって、HTML表現丸ごとだったりして、ペーストすると、余計な装飾まで付いてくることがある。この「余計」という思いは主観だから、場合によっては逆もあり得る。つまり、装飾までコピーしたいのに文字コードしかコピーされないとか、あるいはコピーされているがペーストされないとか。

極論的には、その意味が何で、ペーストした後表示するまでの間に翻訳するとか(つまり”意味”の部分がモデルであり、日本語やロシア語はView側に属する)。これはそんなに突飛な考えではなく、Macの「ようこそ」の画面が多言語で表示されている様子を想像すればいい。「ようこそ」という意味がコート化されていて、「246」という数値で表されているとする、あるいはオブジェクト化されているとする(どんなクラスか今は問わない)と、日本語の画面では「ようこそ」だし、英語の画面では「Welcome」になる。あるいは「SSSSSSSSSSMORKIN'!!!!」でもいい。だがこれが見えないところで通信している間は、ずうっと「246」や「顔の無いオブジェクト」でいていい。

ちなみにマスクに登場するマイロ君はジャックラッセルテリアのスムース。

2011年6月6日月曜日

Objective-Cのgetterの名前はgetなし






setterはsetが頭に付くけど、getterはインスタンス変数名そのまま。
もの凄い思い違いをしてしまった。

そもそもメンバx,yを持つ構造体bobの@propertyがalice.bob.xというドット構文で書かれていて、これだと普通の構造体に代入しているのか、getterを読んでるのかわっかんない。実際どうなんだろう?ということで、せっかくメッセージになってるんだから、見た目そうしようよと[alice getBob].xとかやったらエラーが出る。自動補完も候補無し。あっれ〜。

そこで何を勘違いしたか、構造体だからおかしいのだと、思い込んでしまった。

で、自分で構造体作って、@synthesizeしてやってみるのにマニュアルを確認したら、getなんてどこにも付いてないじゃないか!

ということで構造体も普通に@propertyに出来るし、[alice bob].xでgetterからbobを取ってそのxにアクセスできる。

2011年5月22日日曜日

プレビューの注釈ツール

超今さらだが、Mac付属のアプリ「プレビュー」では、PDFに注釈を付けることができる。これは超便利。「プレビュー」で付けた注釈(を保存したPDF)は、Acrobat Readerで読んでもちゃんと見える。Acrobat Readerでも出来るのかと思ったが、(表示できるものの)編集は出来なそう。

ADCで配布されている『Objective-Cプログラミング言語』(日本語版)の重要な部分にマーカー入れるのにとっても重宝している。

読み進めていると分かり辛いドキュメントだなあと感じていたが、他でObjective-Cの基礎的な事を学んでから戻ってきてみると、こうした重要な記述があって非常に助かる。

-- ADC配布の日本語ドキュメントにある『Objective-Cプログラミング言語』より --

当然ながら、アクセサメソッドを使用してオブジェクトの独自のインスタンス変数にアクセスする場合は、selfを明示的に呼び出す必要があります。以下に例を示します。

self.age = 10;

またはこれと同等の

[self setAge:10];

self.を使用しない場合は、インスタンス変数に直接アクセスします。次の例では、ageのアクセサメソッドは呼び出されません。

age = 10;


※何故か分からないがFireFox4で上記blockquoteを表示すると、濁点の位置が文字の右上じゃなく、左上に付いているという奇妙な現象が。この動きを見ると、全角であっても、濁点を別に描画しているということになるが(左上に濁点が付くフォントは無いと思うので)。

2011年5月6日金曜日

クラスのカテゴリ機能

カテゴリ機能という言い方は我ながらおかしいと思うのだが、クラスのカテゴリ、って切ってしまうと、Objective-Cの記法というより、普通の説明みたいで分かり辛いというか、溶けてしまうので、カテゴリ機能と仮に付けている。

さて、そのカテゴリ機能(書く度に変だと思う:P)だが、名前空間ではないので、結局最後は1つのクラスに統合される。で、重複した場合、元になるクラス(カテゴリ修飾されていない)と重複した場合は、カテゴリ修飾された方が強い(勝つ)。しかしオーバライドとは違って、負けた方は”使えなくなる”ので注意が必要。

作業分担でも効果的とのことだが、ルートクラス(NSObject)にもカテゴリ機能を使ってメソッドを追加できるので、世代ギャップ的にぶつかるケースは出てきそうだが、メソッド名がそもそも長いというのが伝統らしいので、メソッド名の中に名前空間的修飾を入れてしまうのかもしれない。まるでCのように。というかCだし。あ、そういうこと?

といっておきながら、そんなに被ることもないか、という気も。

2011年5月3日火曜日

initWriteContentsOfURL:

initWriteContentsOfURL: - Deprecated in iOS 2.0.

Deprecatedの訳
非推奨みたいな意味だろうと思っていたが、辞書的にしっくりこないのでググる。と、こちらに「廃止予定」という訳が載っていた。非推奨でもいいような気がするが、廃止になったら非推奨じゃ済まなくなるからね。

代替メソッド
initWithContentsOfURL:encoding:error:
initWithContentsOfURL:usedEncoding:error:

両者の違いはencodingが入力であり、呼ぶ側が指定することになる。usedEncodingは取り込んだデータのencodingをセットして返してくれる。らしい。

encoding / usedEncoding
NSStringEncodingなんだが、リファレンスで検索しても出てこない。そこでXcodeで入力し、Jump to Defineすると、unsigned int の typedefじゃないか。で、すぐ上にenumがずらっと並んでいる。まてよ、

enum { NSASCIIStringEncoding = 1, /* 0..127 only */
NSNEXTSTEPStringEncoding = 2,
.
.
};

と書いてある。何か変だなあと思うとタグがない。いいんだっけ? ま、書いてあるんだから良いんでしょうきっと。
でも、initWithContentsOfURL:encoding:error: を使う場合、encodingに何を指定したらいいのか。コンテンツとURLのエンコーディングが違う場合は、こちらを使って明示しなければならないのではないか? とすると、こちらを使う方が、initWithContentsOfURL:usedEncoding:error:より確実なのか? いや、ケースバイケースな気がする。とりあえずinitWithContentsOfURL:usedEncoding:error:で良いものはencodingを指定しなくて良いので、こちらのほうが、古いinitWriteContentsOfURLに近いと思えば良いだろう。

NSError
NSError Class Reference
の中で、
An NSError object encapsulates richer and more extensible error information than is possible using only an error code or error string.
とあるが、この than is が分からないのでググると、
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1335271008
が出てきた。何でも出て来るなあ本当に。みんな、すごいすごい。
ということは、information than information is なのかな。
バカちょんなエラー情報(エラーコードやエラーメッセージ)よりricher で more extensibleだと。

で、こちらのブログに日本語で書かれたものがあって大助かり。ありがとうございます。メソッド名に対応して<a>タグにid=initWithContentsOfURLusedEncodingerrorのような格好でメソッド名(:は無し)が付いているので、リンクが近くて良い。すばらしい。

"Upon return, if url is read successfully, contains the encoding used to interpret the data."

という意味が、used toで引っかかってしまい、何となくurlの内容のencodingがセットされるという意味じゃないかと思うのだが、確信が持てない。で、先の日本語訳でやはり大体そういうような意味だったので納得できた。

「used to --(昔は)よく〜した(ものだった) 」じゃあ、ねぇ。

Objective-Cのコロン
initWriteContentsOfURLではなく、initWriteContentsOfURL:
コロンは最初のパラメータ。コロンがないということはパラメータがないということ。で、偶然か慣習か、コロンの直前の単語がパラメータを示す単語になっている(している)みたい。initWriteContentsOfURL:だとURLが第一パラメータ。2つ以上あっても同じで、initWithContentsOfURL:encoding:error: なら、URL、encoding、errorがそれぞれパラメータになっている。だが、これだけ見ても型が分からないので、中途半端な感じが否めない。でも、もしかしたらそれは、単に馴れてないからその効果が分からないというだけかもしれない。cやc++は関数名的な部分の名前しか分からないわけだから。まあ、早く大きな声で言えるよう、馴れることだ。