実装の流れ(NSMutableArrayの配列編)

NSOutlineViewを表す場合、NSDictonaryなどを使って、木構造をとることが多いので、その例を使って整列を行うメソッドの例を挙げておきます。以下は、itemがchildというキーでNSMutableArrayを持つ場合の例です。子を整列した後、孫について再起呼出しを行っています。

- (void)sort:(NSDictionary*)item by:(NSString*)identifier order:(BOOL)order
{
	NSMutableArray* children = [item objectForKey:@"child"];
	if (!children) return;
	if (order) //昇順でソートします
		[children sortUsingFunction:compare context:identifier];
	else //降順でソートします
		[children sortUsingFunction:compareReverce context:identifier];
	NSEnumerator* enumerator = [children objectEnumerator];
	NSDictionary* dict;
	while (dict = [enumerator nextObject]) {
		[self sort:dict by:identifier order:order];
	}
}

sortUsingFunctionの第一引数は関数ポインタで、配列の際に、比較する回数だけ何度も呼び出されます。なので比較関数はなるべく軽くしておいたほうがいいでしょう(下の例のようにcompareメソッドを使うにしても、メッセージじゃなくてポインタを使うとか)。あまり大きなデータに対しては試していないので、よくわかりませんが。

//昇順のソート
static NSComparisonResult compare(id in1, id in2, void* inKind)
{
	//NSString,NSDate,NSNumberのcompareメソッドを使って比較します。
	return [[in1 objectForKey:inKind] compare:[in2 objectForKey:inKind]];
}

//降順のソート
static NSComparisonResult compareReverce(id in1, id in2, void* inKind)
{
	return compare(in2,in1,inKind);
}

ちなみにFinderのソートの方法はUTF-16を使っている(NSStringはUTF-8)ので、http://developer.apple.com/ja/qa/qa2004/qa1159.htmlのようにして、Finderと同質のソートを行うことも可能です。