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'
えーっと、シグネチャの文字列のドキュメントってどこにあったんだっけな。MDEventFieldData
は union
なんで、これがどうも臭い。テストプログラムを書いてみた。
#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 でチェックが厳しくなって、今まで素通りだったコードが許されなくなった、という話らしい。