在没有参数的情况下调用参数化选择器时会发生什么?

时间:2015-04-08 08:53:37

标签: ios objective-c

我正在讨论使用选择器的this示例。为方便起见,我从那里复制了代码。

// MYTapGestureRecognizer.h

@interface MYTapGestureRecognizer : UITapGestureRecognizer

@property (nonatomic, strong) NSString *data;

@end


// MYTapGestureRecognizer.m

@implementation MYTapGestureRecognizer

@end


// =====================

....

MYTapGestureRecognizer *singleTap = [[MYTapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];

singleTap.data = @"Hello";

.....


// ====================

-(void)tapDetected:(UITapGestureRecognizer *)tapRecognizer {

MYTapGestureRecognizer *tap = (MYTapGestureRecognizer *)tapRecognizer;

NSLog(@"data : %@", tap.data);

}

我的问题是

1 - 当self调用选择器时,它在上述情况下传递了哪个参数?

2-如果调用选择器(指向需要参数的方法)(参见下面的示例)并且没有传递参数,那么在这种情况下是否有任何默认值?如果可能,是否有任何文件?

假设MyTest的签名是

- (void) MyTest : (NSString*) a;

现在构建并调用选择器

SEL a = NSSelectorFromString(@"MyTest:");

    [t performSelector:a]; //Works Fine and the call is made - However Notice no parameter is passed . In this case what would the value of the parameter be in the method ?

我检查了以下内容,但我找不到此信息

Apple docs

Rys Tutorials

4 个答案:

答案 0 :(得分:1)

您的问题的答案: -

  1. 当自我调用选择器时,它在上述情况下传递了什么参数?
  2. 如果检测到点击并且调用了选择器,则该参数将是UITapGestureRecognizer的对象。这将是检测到轻击手势的相同实例。

    1. 此外,如果调用选择器(指向需要参数的方法)(参见下面的示例)并且没有传递参数,那么在这种情况下是否有任何默认值?如果可能,是否有任何文件?
    2. 为什么要这样调用方法,有什么特殊目的吗?如果没有,您可以像

      一样调用该方法

      [self tapDetected:nil];

      [self performSelector:@selector(tapDetected:) withObject:nil];

      如果你按照问题中提供的方法调用方法,很可能它会崩溃。

答案 1 :(得分:0)

通常,如果您想通过self访问该选择器,请使用它:

[self tapDetected:nil];

您需要在选择器中处理此案例,例如:

-(void)tapDetected:(UITapGestureRecognizer *)tapRecognizer {
     if (tapRecognizer)
     {
         MYTapGestureRecognizer *tap = (MYTapGestureRecognizer *)tapRecognizer;

         NSLog(@"data : %@", tap.data);
     }
     else
     {
          //Do your work
     }
}

此外,不仅如此,如果您不确定要传递的参数,请将选择器decalartion更改为id,如:

 -(void)tapDetected:(id)sender {

     NSString *className = NSStringFromClass([id class]);
     NSLog(@"Object passed is of class : %@", className);         

     //And make check here
     if ([id isKindOfClass:[MYTapGestureRecognizer class]])
     {
          //Do your work here
     }
 }

没有默认情况,您需要手动处理每个案例,否则应用程序将崩溃。

答案 2 :(得分:0)

如果您希望在self上调用该方法,请将nil参数传递给它。但我不明白它为你服务的目的是什么。

此外,如果您不向您的方法发送参数,它将在您的构建中失败。您必须传递参数或nil。

此外,如果您的方法不接受nil参数,则可能会导致异常 - 'NSInvalidArgumentException'

答案 3 :(得分:0)

SEL a = NSSelectorFromString(@"MyTest:");
[t performSelector:a]; //Works Fine and the call is made - However Notice no parameter is passed . In this case what would the value of the parameter be in the method ?

这将是未定义的垃圾。您无法保证它可能包含的内容。最有可能的是,它将是一个无效的指针。如果您不幸,它可能是指向某个任意对象的有效指针,并且对其进行操作会破坏您应用的状态。如果你很幸运,它会崩溃,所以你可以找到问题。