我想从NSInvocation派生一个MyInvocation,这个MyInvocation带有成员变量的。
但NSInvocation的实例只能通过 + (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature获得。
也就是说,NSInvocation的init是无效的。所以无法通过重写init函数来实例化MyInvocation。
那么我该如何实例化MyInvocation呢?

解决方案 »

  1.   

    子类也通过类方法初始化,即重写invocationWithMethodSignature
    另外这个类似乎没有派生的必要吧?
      

  2.   

    如何重写?
    我用派生类实现类似function adepter的模式。
      

  3.   

    跟重写init一样的,只不过现在是重写类方法:
    + (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature
    {
        ......
        return [super invocationWithMethodSignature:signature];
    }
      

  4.   

    @interface Adepter:NSInvocation{
    int paramIndex;
    }
    @end+ (Adepter *)invocationWithMethodSignature:(NSMethodSignature *)signature
    {
        ......
        return [super invocationWithMethodSignature:signature];
    }
    这样?另外我需要在return前设置实例的paramIndex的值,该怎么做呢?
      

  5.   

    paramIndex的值如果需要以参数传进来的话,你需要定义自己的构造函数
    比如:
    + (Adepter *)invocationWithMethodSignature:(NSMethodSignature *)signature index:(int)index
    {
      paramIndex = index;
      return [super invocationWithMethodSignature:signature];
    }
      

  6.   

    很遗憾,这个类方法是没法访问paramIndex这个实体变量的。你试过编译没?
      

  7.   

    哦,对了,忘了这回事儿了,看来派生类的方法不行.
    所以还是回到原来的问题,这个类没有派生的必要
    你想要通过index找到对应方法完全可以通过NSInvocation的setTarget, setSelector来完成
    NSInvocation本身已经是一个adapter了
      

  8.   

    那么看来只要是类似的不提供init方法的类都是没办法派生的了。
    NSInvocation很原始,只有setArgument:atIndex:,可是我要的是一个能不断追加参数而不去关心index的adpter,这点NSinvocation做不到。
      

  9.   

    我觉得你不必非要考虑派生类,isa不行还有has-a
    用一个类包含两个实例变量NSInvocation,int不行么?
      

  10.   

    我现在就是这么干的。然后再用message forwarding 来模拟派生。发这贴是想看看是不是除了这种方法以外还有其他更简洁的方法。
      

  11.   

    当然利用objc的runtime也可以模拟继承什么的,不过比我现在用的更丑。