2015-04-08 4 views
0

Я перебирал пример 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

+0

Как вы думаете? Думаю, нуль. Все нули. – Andy

ответ

0

Обычно, если вы хотите получить доступ к этому селектор через себя, использовать его как:

[self tapDetected:nil]; 

Вы должны обрабатывать этот случай в вашем селекторе, например:

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

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

Также не только этого, если вы не уверены в параметре, который вы проходите, измените свою декаляцию выбора как 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 
    } 
} 

Нет случаев по умолчанию, вам нужно обрабатывать каждый случай вручную, иначе приложение будет аварийно завершено.

+0

Поскольку селектор вызывается за сценой, я хотел знать, какой параметр передается селектору при его вызове. Также есть ли определенное правило, которое указывает, какие параметры должны быть переданы, если селектор вызывается без параметров? –

+0

См. Мой отредактированный ответ, таким образом вы можете определить, какой объект класса передан. – itsji10dra

+0

Обновите мой вопрос, чтобы сделать его более понятным. какой объект передается при вызове метода «tapDetected»? –

0

Если вы хотите вызвать метод self, передайте ему параметр nil. Но я не понимаю, с какой целью это служит вам.

Кроме того, если вы не отправляете параметры своим методам, это приведет к сбою в ваших сборках. Вы должны пройти либо параметр, либо нуль.

Кроме того, если ваш метод не принимает нулевые параметры это может вызвать исключение - «NSInvalidArgumentException»

+0

Я мог бы назвать метод и ничего не пропускать. Пример, указанный выше, отлично работает –

1

Ответы на вопросы: -

  1. Когда самостоятельно вызывает селектор какой параметр проходит ли это в вышеупомянутый случай?

Если кран обнаружен и селектор называется, параметр будет являться объектом UITapGestureRecognizer. Это будет тот же самый экземпляр, на котором обнаружен жест нажатия.

  1. Также, если вызывается селектор (указывающий на метод, требующий параметров) (см. Пример ниже), и никакие параметры не передаются, есть ли значения по умолчанию в этом случае? Если возможно, есть ли для этого документация?

Почему вы хотите вызвать метод, подобный этому, есть ли какая-то особая цель ?. Если нет, то вы можете вызвать метод так же, как

[self tapDetected:nil];

или

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

При вызове метода, как это предусмотрено в этом вопросе, скорее всего, это приведет к краху.

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 ? 

Это будет неопределенным барахло. У вас нет гарантий относительно того, что он может содержать. Скорее всего, это будет неправильный указатель. Если вам не повезло, это может быть действительный указатель на какой-то произвольный объект, и работа над ним приведет к повреждению состояния вашего приложения. Если вам повезет, он потерпит крах, чтобы вы могли найти проблему.

Смежные вопросы