ページ

2009年9月21日月曜日

Snow Leopardの Blocksその2: -[NSMutableArray sortUsingComparator:] でEXC_BAD_ACCESS

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Blocks を試している。
今度は -[NSMutableArray sortUsingComparator:] を使ってソートをしてみる。

 NSMutableArray* array = [NSArray arrayWithObjects:
@"monkey", @"dolphin", @"elephant", nil];
[array sortUsingComparator:^(id obj1, id obj2) {
NSLog(@"%@, %@", obj1, obj2);
return [obj1 compare:obj2];
}];



何故か EXC_BAD_ACCESS が出てしまった。

コンソール出力。
2009-09-21 23:44:14.717 BlocksStudy[1401:80f] monkey, 0
2009-09-21 23:44:14.720 BlocksStudy[1401:80f] dolphin, 1
2009-09-21 23:44:14.721 BlocksStudy[1401:80f] elephant, 2
2009-09-21 23:44:14.722 BlocksStudy[1401:80f] monkey, dolphin
2009-09-21 23:44:14.723 BlocksStudy[1401:80f] monkey, elephant
2009-09-21 23:44:14.724 BlocksStudy[1401:80f] dolphin, elephant
プログラムはシグナルを受信しました:“EXC_BAD_ACCESS”。
sharedlibrary apply-load-rules all


うーむ。使い方がまずいのか?

未解決。

(9/25追記)
NSMutableArray ではなく、NSArray に対してソートをかけていたのが EXC_BAD_ACCESS の原因だった。コメントでの指摘で気がついた。あちゃー。。

以下で問題なく動作しているのが確認できた。

 NSMutableArray* array = [NSMutableArray arrayWithObjects:
@"monkey", @"dolphin", @"elephant",
@"cat", @"dog", nil];

[array sortUsingComparator:^(id obj1, id obj2) {
return [obj1 compare:obj2];
}];

NSLog(@"%@", array);


結果
2009-09-25 23:08:42.986 BlocksStudy[4831:80f] (
cat,
dog,
dolphin,
elephant,
monkey
)


Blocks なかなかいい。