2017-01-11 9 views
-1

동일한 인수 유형이지만 다른 인수를 사용하는 선택자는 어떻게 다른가요?iOS performSelector : withObject : withObject : really do?

동일한 인수 유형을 가진이 두 개의 선택기가 있습니다.

- (void)methodWithCallBack:(void(^)(void)) cb double:(double)value { 
    NSLog(@"%s %f", __PRETTY_FUNCTION__, value); 
    if (cb) { 
     cb(); 
    } 
} 

- (void)methodWithDouble:(double)value callBack:(void(^)(void)) cb { 
    NSLog(@"%s %f", __PRETTY_FUNCTION__, value); 
    if (cb) { 
     cb(); 
    } 
} 

performSelector : withObject : withObject :이 선택기로 호출 할 때 다른 결과가 나타납니다.

[self performSelector:@selector(methodWithDouble:callBack:) withObject:@(2.5) withObject:[^(void){ 
    NSLog(@"Test Call Back Double"); 
} copy]]; 

[self performSelector:@selector(methodWithCallBack:double:) withObject:[^(void){ 
    NSLog(@"Test Call Back Double"); 
} copy] withObject:@(2.5)]; 

어떻게됩니까? performSelector : withObject : withObject : 실제로 무엇을합니까?

+0

두 가지 방법으로 얻은 두 가지 결과는 무엇입니까? – nayem

+0

이들 메소드 중 어느 것도'peformSelector : withObject : withObject :'와 함께 사용할 수 없습니다. 'peformSelector : withObject : withObject :'는 메소드가 객체 포인터 타입의 두 개의 매개 변수를 가질 것을 요구합니다. 이 두 메소드는 모두 객체 포인터 유형 (특히 블록 포인터)의 매개 변수 하나와 기본 'double'유형의 매개 변수 하나만 가지고 있습니다. 'NSNumber *'에 랩핑하면 마술처럼'double'을 취하는 메서드로 작동하지 않습니다. 메서드가 실제로'NSNumber *'를 취한 경우에만 작동합니다. – newacct

+0

당신이 여기에서 무엇을하려고하는지, 왜 하드 코드 된 선택자로'performSelector'를하고 있는지는 명확하지 않습니다. 그냥 직접 호출 할 수 있습니다. – newacct

답변

-1

@ (2.5)가 무엇인지 전혀 알지 못합니다. NSNumber 리터럴은 @ 2.5입니다. double은 객체가 아니고 NSNumber이 객체입니다. NSNumber을 전달해야합니다.

두 번째 메모에서 : 나는 Apple이 만든 performSelector:withObject:withObject:이 이상하다고 생각합니다. 실제로 "withObject"하나만 있으면 충분합니다. 전달하려는 객체가있는 NSArray을 전달하면됩니다.

예 :

NSNumber *var1 = @2.5; 
NSString *yourMom = @"Sally"; 
NSArray *params = [NSArray arrayWithObjects:var,yourMom,nil]; 
[self performSelector:@selector(goMethod:) withObject:params];