2009年11月11日

2009年11月11日: Alchemusica のデバッグ

 Alchemusica のイベントリストテーブルが時々妙な挙動をする。セルを編集した後別のセルに移ると、普通は編集に使ったテキストフィールドがいったん隠されて、新しいセルに移る。ところが、このテキストフィールドが元の位置に残ったままで、新しいセルの編集を始めてしまうことがある。確か 10.4 までは起きなかったぞ、10.5 でどこか仕様が変わったんか? いろいろ調べて、結局 tableView:setObjectValue:forTableColumn:row: の中で Objective C の例外が投げられているらしい、とつきとめた。例外が起きるコードはこれ。

[[[self undoManager] prepareWithInvocationTarget: self] changeValue: ed2 ofType: code atPosition: position inTrack: trackNo];

 デバッガコンソールには、こんなメッセージが出る。

+[NSMethodSignature signatureWithObjCTypes:]: unsupported type encoding spec '(' in '4(MDEventFieldData=llf{MDSMPTERecord=b1b6b6b6b5b8}i[4C]*^v)8i12l16l20'

 えーっと、シグネチャの文字列のドキュメントってどこにあったんだっけな。MDEventFieldDataunion なんで、これがどうも臭い。テストプログラムを書いてみた。

#import <Cocoa/Cocoa.h> typedef union A { int a; float b; } A; @interface MyObject : NSObject { } - (BOOL)changeValue: (A)value; @end @implementation MyObject - (BOOL)changeValue: (A)value { return YES; } @end int main(int argc, const char **argv) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; MyObject *x = [[MyObject alloc] init]; NSMethodSignature *sig = [x methodSignatureForSelector: @selector(changeValue:)]; int i, n; NSLog(@"sig = %@", sig); n = [sig numberOfArguments]; for (i = 0; i < n; i++) { const char *p = [sig getArgumentTypeAtIndex: i]; NSLog(@"arg %d : %s", i, p); } return 0; }

 10.5 での実行結果。ビンゴですね。

2009-11-11 22:34:11.984 a.out[1503:10b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[NSMethodSignature signatureWithObjCTypes:]: unsupported type encoding spec '(' in '4(A=if)8'' 2009-11-11 22:34:11.987 a.out[1503:10b] Stack: ( 2478833643, 2468544059, 2478841071, 2478842271 ) Trace/BPT trap

 ちなみに、Mac OS 10.4 では正常終了。

2009-11-11 22:54:38.840 a.out[2036] sig = NSMethodSignature: types=c@:(A=if) nargs=3 sizeOfParams=160 returnValueLength=1; 2009-11-11 22:54:38.841 a.out[2036] arg 0 : @ 2009-11-11 22:54:38.841 a.out[2036] arg 1 : : 2009-11-11 22:54:38.842 a.out[2036] arg 2 : (A=if)

 実はちゃんと NSInvocation のドキュメントに書いてあるじゃん。読めよ自分。

NSInvocation does not support invocations of methods with either variable numbers of arguments or union arguments.

 10.5 でチェックが厳しくなって、今まで素通りだったコードが許されなくなった、という話らしい。

タグ:Mac Alchemusica
Posted at 2009年11月11日 22:59:27
email.png