Pages

2009-08-31

OMWizard 1.3 Snow Leopard対応版

Snow LeopardにしたらOMWizardが起動しなくなったので、その対応版です。ちょっと細かい挙動も修正しましたが、新機能は特にありません。Download. Snow Leopard専用です。それ以前のシステムでは動きません。v1.2を使用してください。

OMWizard 1.3

OMWizardは、Macの中に散らばっているファイルやフォルダをOpenMetaのタグを使って簡単に探し出すためのアプリです。最初はタグのリネームアプリだったのに、いつのまにか検索用になってました。もちろんリネームもできます。

今回Snow Leopardで起動できなくなったのは、QuickLookの仕様が変わったから。プライベートAPIを使った弊害です。

Snow Leopardで利用可能になったAssociated Object

Leopardで大幅に手を加えられたObjective-Cのランタイムですが、Snow Leopardでもちょこっとだけランタイムに手が加えられました。それがAssociated Objectです。こいつはあるオブジェクトに対してキー付きで任意のオブジェクトをひも付けすることができるもので、ランタイム関数を使うことで簡単に扱えます。コードはこんな感じ。

id obj = ...;   // 任意のオブジェクト
NSString *key = @"key";    // キー

objc_setAssociatedObject(obj, key, @"value", OBJC_ASSOCIATION_RETAIN);

objc_getAssociatedObject(obj, key);   // → @"value" が取り出せる

objc_setAssociatedObject()で、オブジェクトに他のオブジェクトをひも付ける。2つ目の引数に取り出すときのキーを設定するんだけど、これはvoid *なので別にNSStringじゃなきゃいけないとかいうわけではありません。4つ目の引数はオブジェクトの扱い方。ここではOBJC_ASSOCIATION_RETAINを渡しているので、ひも付けたオブジェクトはretainされる(はず)。

取り出すときはobjc_getAssociatedObject()を使う。元のオブジェクトとキーを渡すことでひも付けたオブジェクトを得られます。ちなみにobjc_removeAssociatedObjects()なんてのもあって、オブジェクトのひも付けを解除できます。

で、どういう時にこのAssociate Objectが役立つかというと、カテゴリで既存のクラスを拡張する時。カテゴリではメソッドを追加できるけどインスタンス変数は追加できない、でも値を保持したいってときにこのAssociated Objectが役に立つはず。多分。今のところAppleのドキュメントにはどこにもこれに関する記述はありませんが、Square Signals : Your New Friends: Obj-C Associated Objectsのように参考になるエントリがいくつかあります。

Snow Leopardで利用可能になったブロック構文

Snow Leopardでは、C/C++/Objective-Cでブロック構文が使えるようになりました。今のところGrand Central Dispatchとともに語られることが多いようですが、GCD専用とかいうわけでは全然なくて、汎用的な無名関数とかラムダみたいな感じで簡単に使えます。こんな感じ。

void (^block)(id);

block = ^(id obj) {
    NSLog(@"%@", obj);
};

block(self);

これと同時にCocoaも拡張されていて、NSStringの- enumerateLinesUsingBlock:といったように、ブロックを引数として取るようなメソッドがいくつか追加されています。メソッドだけでなく新しいクラスも登場していて、NSBlockOperationのようにブロックを用いてNSInvocationOperationと同じようなことができるクラスも追加されています。

2009-08-29

Snow LeopardのNSTextViewでテキストの自動置換を有効にする方法

各所で話題になってるSnow Leopardですが、その中でちょっと嬉しいけど地味な新機能としてテキストの自動置換機能があります。正式名称はなんていうのか知りませんが、システム環境設定→言語とテキスト→テキストで設定できるアレです。テキストエディットとかでは使えるんですが、サードパーティのアプリはそれぞれが対応する必要があります。

対応と言っても大掛かりな実装は必要なく、テキストの自動置換機能を有効にしたいNSTextViewに対して- setAutomaticTextReplacementEnabled:YESを送ってやるだけです。これはSnow Leopardで新たに登場したもので、その名の通り自動置換を行うかどうかをセットするためのものです。ちなみにInterface Builderから"Text Replacement"にチェックをいれても変更できます。おお、簡単。

Snow Leopardでは他にもテキスト周りの新機能(スペルの自動修正とか)があり、それに関するメソッドがNSTextViewに追加されています。追加されたメソッドの一覧がADCで見られます。