NSInvocationは可変個引数のシグネチャに対応していない

以前に紹介したBBAsyncTaskだが、AndroidJavaのように起動するメソッドのシグネチャを可変(Variadic)にしようと思い、プロトコルを以下のように修正して実装〜テストをしていたのだが、

BBAsyncTaskProtocol.h
@protocol BBAsyncTaskProtocol <NSObject>
@required
 - (id)executeInBackgound:(id)params, ...; 
@optional
 - (void)preExecute:(id)params, ...;
 - (void)postExecute:(id)executeResult;
@end
HogeTask.m
- (id)executeInBackgound:(id)params, ...; 
{
    va_list args;
    va_start(args, params);

    id param2 = va_arg(args, id);
    va_end(args);
    〜
}

va_listからパラメタの値を取得(param2)しようとするとEXC_BAD_ACCESS。
いろいろ試したが解消できず。

まさかと思って調べたのだが、

NSInvocation does not support invocations of methods with either variable numbers of arguments or union arguments.
You should use the invocationWithMethodSignature: class method to create NSInvocationobjects;
you should not create these objects using alloc and init.
NSInvocation Class Reference

ガーン。

NSInvcation incompatibility
NSInvocation does not support variadic methods. I'm not sure why this is ― maybe NSInvocation wants to avoid making assumptions about va_list, maybe it is because NSMethodSignature can't describe the storage requirements of variable arguments for NSInvocation or maybe the Cocoa developers have families and just wanted to go home early.
Cocoa with Love: Variable argument lists in Cocoa

ガガガーン。

ということでNSInvocationで可変個引数を扱うことはできないらしい。残念だ。

設計の古さもあるんだろうが、引数の型情報を取れなかったり、可変個引数に対応できなかったりと、どうもこの辺がちぐはぐなんだよなぁ。