【问题标题】:Reference of methods方法参考
【发布时间】:2012-07-05 19:21:35
【问题描述】:

我正在为 IOS 开发一个库,在某些时候需要创建一个 NSArray 的各种类的方法引用。到某个会在某个时候调用它们的单个类。

有什么办法吗?

谢谢

【问题讨论】:

    标签: iphone ios ipad ios5 methods


    【解决方案1】:

    您可以将选择器添加到您的array。你可以像这样创建一个选择器:

    -(void)myMethod:(int)something

    SEL selectorToMyMethod = @selector(myMethod:);

    希望对你有帮助,干杯!

    【讨论】:

    • 哦,我忘了 SEL 不是一个对象,但你总是可以将它们转换为一个,像这样:[NSValue valueWithPointer:@selector(x)]
    • 我以后如何从另一个类调用它?
    • 您向您的对象发送“performSelector”消息:[myObject performSelector:@selector(selectorToMyMethod)];
    • 您可以存储NSString's,然后将它们转换为选择器...但我更喜欢NSInvocation 方式,我认为它更干净。
    【解决方案2】:

    你有一些选择。您可以使用NSStrings 来实际命名您的方法,然后执行以下操作:

    NSString *myMethodName = @"hellWorld";
    SEL selector = selectorFromString(myMethodName);
    

    然后您可以将您的选择器添加到您的NSArray

    您也可以使用NSInvocations 并存储方法并稍后定义目标:

    一个 NSInvocation 对象包含一个 Objective-C 的所有元素 消息:目标、选择器、参数和返回值。每个 可以直接设置这些元素,并设置返回值 在调度 NSInvocation 对象时自动执行。

    来自Apple Documentation

    编辑 1(为了好玩):

    - (Method *)getMethodsPointer{
        unsigned int number = 0;
    
        Method *myMethods = class_copyMethodList([self class], &number);
    
        //for(int i=0;i<number;i++)
        // {
        //    printf("%s",sel_getName(method_getName(myMethods[i])));
        //}
        return myMethods;
    }
    

    【讨论】:

      【解决方案3】:

      您可以创建一些 NSInvocation,在其中存储选择器和目标类,然后将 NSInvocation 添加到数组中。

      仅存储选择器是可能的,但前提是方法仅在一个类中 - 因为选择器独立于它们的类。

      【讨论】:

      • 您实际上可以在不响应它的对象上调用选择器。实际上,您稍后将不得不使用forwardInvocation: 处理这个问题。这是一种创建多重继承的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      相关资源
      最近更新 更多