【问题标题】:What is use of performSelector in iOSiOS 中的 performSelector 有什么用
【发布时间】:2012-07-18 10:39:21
【问题描述】:

performSelector的作用是什么?

比较:

[self btnClicked];

[self performSelector:@selector(btnClicked)];

-(void)btnClicked
{
    NSLog(@"Method Called");
}

对我来说,两者都很好。这两者有什么区别。 [self btnClicked][self performSelector:@selector(btnClicked)];

【问题讨论】:

    标签: ios objective-c performselector


    【解决方案1】:

    selector 对象允许您调用编译时不知道的方法。你只需要知道一个方法的名字作为一个字符串就可以调用它。

    如果您正在调用的方法的名称在编译时已知,则使用选择器会适得其反:代码变得不那么可读,没有明显的优势。当您编写的库需要在与库分开编译的其他代码中调用方法时,选择器提供了一种将两段代码解耦的方法。

    例如,如果你正在编写一个定时器类,它可以在时间间隔结束时回调你,你的定时器不知道它需要调用的函数的名称,所以它不能写这样的东西:

    // We do not know if the function is called intervalHasExpired or something else
    [target intervalHasExpired];
    

    但是如果你给你的定时器一个选择器,定时器就可以给你回电话。

    [myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)];
    

    【讨论】:

      【解决方案2】:

      正如您所演示的那样,两者在使用时非常相似,但后者的优点是您可以动态确定在运行时调用哪个选择器。

      SEL selector = [self gimmeASelectorToCall];
      [self performSelector: selector];
      

      [Source]

      【讨论】:

        【解决方案3】:

        Apple 文档是你的朋友。

        NSObject Protocol Reference

        向接收者发送指定消息并返回结果 消息。

        特别是:

        performSelector:方法相当于发送一个aSelector 直接向接收者发送消息。例如,所有三个 以下消息做同样的事情:

        id myClone = [anObject copy];
        id myClone = [anObject performSelector:@selector(copy)];
        id myClone = [anObject performSelector:sel_getUid("copy")];
        

        然而,performSelector: 方法允许你发送消息 直到运行时才确定。变量选择器可以作为 论据:

        SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation();
        [anObject performSelector:myMethod];
        

        aSelector 参数应该标识一个不接受的方法 论据。对于返回对象以外的任何内容的方法,请使用 NSInvocation。

        希望对您有所帮助。

        【讨论】:

        • @stackBlue 不客气。我将 Apple doc 中的主要部分标记为粗体。如果您愿意,请投票 :-) 干杯。
        【解决方案4】:

        PerformSelector 基本上允许您决定在运行时(后期绑定)传递什么消息,而不是像普通 C 这样的语言。如果您知道目标 C 类中方法的名称,则可以使用

        NSSelectorFromString()
        

        将字符串转换为选择器,并让您的类使用 performSelector 调用该选择器。这样,您可以在运行时选择不同的函数来调用。您甚至可以使用配置文件选择要调用的函数。

        【讨论】:

          【解决方案5】:

          performSelector 调用已在类中声明和实现的方法。当您需要将代码中的操作附加到事件时使用它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多