Objective-C

Objective-Cの好きなところ

私は評論家ではなく開発者なので、Objective-Cの良い所(というか好きな所)も書いておこうと思う。 オブジェクト指向であること Objective-Cなのだから当たり前なのだが、継承、委譲、カプセル化、ポリモーフィズム等、他のオブジェクト指向言語と同様にオブ…

Objective-Cの一寸残念な所

2ヶ月程度Objective-Cを勉強してきたが、少しずつその特徴が見えてきた。 カテゴリやプロトコル等、素晴らしい点がたくさんあるのだが、同時にいくつかの残念だとと思う点も見えてきた。 C言語であること Objective-CはJavaやC#等のようにCのシンタクスをベ…

AppCode 1.5

3/13にリリースされたAppCode 1.5を早速試してみた。 一番の興味は、私が問題としていた3つの不具合がFixされたかどうかである。 突然無応答になることがある コーディング中は無くなったが相変わらずデバッグ時などに無応答になる時間がある。しかし、今日…

JetBrains AppCode

InteliJ IDEA等、数々のIDE(統合開発環境)を提供してきたJetBrains社製のIDEがAppCodeだ。 JetBrains AppCode: an Objective-C IDE That Makes a DifferenceサポートするプラットホームはMac OS/Xネィティブ、つまりCocoaやiOSアプリケーションを開発するた…

安易さと習慣

Appleが提唱するObjective-Cのコーディングガイドラインではレシーバの属性などを返す単純なアクセッサや副作用の無い問い合せにはget〜のプレフィクスが不要だとある。 Coding Guidelines for Cocoa: Naming Methods - (NSSize)cellSize; //正しい - (NSSiz…

idとdoubleの相互変換 (その2)

リファレンスのコードだったが、残念だがこれでは上手く行かない。テストしてみればわかるのだが、ivarにint型の値を設定した呼び出しだとテストが通るのだが、double等の実数だと想定したように値を読み書きできないのである。 ダンプで明らかになったが、_…

idとdoubleの相互変換

昨日はIvarの取得を行うコードに言及したが、同じようにIvarの設定を行う関数はruntimeのソースコードを元に以下のようなコーディングにした。 Ivar _object_setInstanceVariable(id obj, const char *name, void *value) { Ivar ivar = NULL; if (obj && na…

ドッグフード

エラー内容からARCが原因であることは間違い無い。引数の型がvoid**であることから、パラメタのオーナシップの移動に関してであろうことは想像に難くないが、「何故」駄目なのかをきちんと知りたいところ。 ランタイムAPIの一つ、インスタンスフィールド※を…

not available in automatic reference counting mode

現在、rutime.hを使って、それぞれ任意のメソッドを実行できる、任意のプロパティを読み書きできる、インスタンスフィールドを読み書きできるユーティリティをそれぞれ書いているのだが、最後に書いたインスタンスフィールドにアクセスするコードで、どうし…

variadic method (その3)

可変引数を使った任意のメソッドの呼び出しはようやく形になってきたが、C言語の経験値の低さ故にはまることが多い。同メソッドだが、引数の型に合わせてva_listから値を取り出さなくてはならないため、va_listをメソッド間で引き渡す必要が出てくる。 NSObj…

alloca (__builtin_alloca)

いくらCを完全に内包しているといっても、Objective-Cを使っている以上一行たりともCのコードは書きたくないのだが、ランタイムAPIを初めとしてそこかしこにCのコードがある以上、無視する訳にはいかないのが悲しい。自動変数でメモリバッファをいちいちアロ…

variadic method (その2)

いろいろ調べてみたが、やはり可変引数をそのままobjc_msgsendに渡すことは出来ないようなので、当初考えていたNSInvocationsとNSMethodSignatureを使って実装することにする。 NSObject+MethodUtil-invokeMethodNamed - (id)invokeMethodNamed:(NSString*)n…

variadic method

Cのprintfのように可変引数つきの関数のことをvariadic functionと呼ぶ。 Variadic Functions - The GNU C LibraryObjectivce-Cのvariadic function(この場合はvaliadic methodか)はCに習ってシグネチャを以下のように書ける。 - (id)variadicMethod:(id) ar…

他のリストを含むリスト

あるリストに他のリストが含まれている(サブセット)ことを検査する場合、例えばJavaだとList#containsAllを使えば良いがObjective-CのリストにあたるNSArray/NSMutableArrayには同様のメソッドは実装されていないようだ。単一の要素が含まれるか否かを検査す…

ランタイムAPI

ここまでKVCやKVOを使ったり実行されているメソッドの情報を取得してきたが、いよいよObjective-Cにおけるクラスのランタイムつまり実行時のメタ情報(メタクラス、プロパティ、フィールド)を取得する要求が出て来た。JavaやC#の場合、リフレクション機能を使…

エンコードされた型

つまりはNSMethodSignature-getArgumentTypeAtIndex:で引数の型、NSMethodSignature-methodReturnType:で戻り値の型が戻るのだが、char*で戻る訳であって最後は文字比較になってしまうのが格好悪い。 格好悪いなんて書いたが、それは違う。やはり私の無知だ…

メソッドの引数の型を調べる

Objective-Cでメソッド(メッセージ)の型を調べることは可能だろうか、またどのようにして実装すれば良いのだろうか。いろいろ調べてみたが、自身が持つメソッド"fooBar:"の引数の個数と型を調べるコードは以下のようになるようだ。 SEL selector = @selector…

KVOのコールバックをセレクタで登録する (その2)

さて、昨日の続きだ。元々Foundationで実装されているKVO監視機構にセレクタの情報を持たせる方法だが、自分で書く前に調べたところやはり同じというかそのものずばりを書いている先輩がいた。※ mikeash.com: Key-Value Observing Done Right このサイトでは…

KVOのコールバックをセレクタで登録する

またまた随分と時間が空いてしまったが、一応続きの話。 このように便利なKVOだが、今ひとつ使いにくい部分もある。 その辺は次回にでも。 KVO監視は便利なのだが、NSKeyValueObserving簡易プロトコルに準拠した以下のメッセージに応答できるようにクラスを…

シンボリック・ブレークポイント

Unrecognized Selectorのようにどこのメソッドが実行された際に発生したか判り難いエラーの場合、以下のシンボリック・ブレークポイントを作ってやることで、直接的にどこでエラーが発生したかが分かり易くなる。 -[NSObject doesNotRecognizeSelector:]NSOb…

Unrecognized Selector その後

Objective-Cのリンカのバグで、静的ライブラリ内で実装されているカテゴリを呼ぶ場合に同エラーが発生してしまうらしいのだ。 解消方法は、プロジェクトターゲットの"Build Settings"中、パラメタ"Other Linker Flags"に"-ObjC"、更には"-all_load"を追加し…

unrecognized selector

またもや皆が通る試練を受けてしまったようだ。 次のネタにする予定だった、KVOの発展系のテストをしていたのだが、外部に定義したカテゴリのメソッドを使うと何故か例外が発生してメソッドが実行できない。 []:〜unrecognized selector sent to instance 0x…

KVO (Key-Value Observing)

Mac OS Xのプログラミングに詳しい方はとっくにご存じだと思うが、この「プロパティの変更通知機能」はCocoaフレームワークとして既に実装されているのだ。それが Key-Value Observing 略して KVOである。 Key-Value Observing Programming Guide: Introduct…

プロキシ(NSProxy)による変更通知 (その2)

また日が空いてしまったが更に続きを。 //この後やること//プロパティ名から現在のプロパティ値取得//メソッドのパラメタから新たに設定されるはずのプロパティ値を取得//新旧のプロパティを比較して変更されていれば通知 ここを埋めていく。通知するのは後…

performSelectorとパラメタ数

JavaやC#のInvokeはそのオブジェクトの持つメタ情報からメソッド実行する(メッセージを送る)が、Objective-Cでそれに相当するのがNSObjectプロトコル(クラスではない)performSelector:メソッドだ。メソッドの実態であるセレクタをメタ情報や文字列から生成し…

プロキシ(NSProxy)による変更通知 (その1)

さて、日が空いてしまったが先日の続き。 プロキシの同メソッドをオーバライドすることでターゲットオブジェクトの処理の前後に処理を挿入することが出来る。 DynamicProxyでターゲットオブジェクトの全てのメッセージに割り込みたかったのは、今までJavaやC…

does not declare a method with selector

NSStringクラスのカテゴリ(クラスエクステンション)を書いていた所、コンパイルで以下のようなエラーに遭遇した。 Receiver type 'NSString' for instance message does not declare a method with selector 'capitalizedFirstOnly' 初心者の私には、まるで…

KVC「キー値コーディング」

KFC、いやKVC(キー値コーディング)とはNSKeyValueCoding非形式プロトコルによる、間接的なオブジェクトのプロパティへのアクセスとバリデーションのためのフレームワークを指す。 NSKeyValueCoding Protocol Reference - Mac OS X Developer LibraryNSKeyVal…

NSProxy

JavaやC#でクラスのメッセージに対する振る舞いを動的に変更しようとした場合、必ずといって良い程お世話になるのがProxyクラスだが※、Objective-Cにもちゃんとある。 NSProxy Class Reference - Mac OS X Developer Library NSProxy.h @interface NSProxy <NSObject> </nsobject>…

NSConding-encodeWithCoderメソッドで保存されるデータ

NSCodingプロトコルにより永続化されたオブジェクトのデータはどのようなフォーマットなのだろう。人が見て分るようなものだのだろうか。また、Windows側では読込んだり編集したりすることはできるのだろうか。サンプルには前回のエントリで永続化したPosses…