2014-10-08 5 views
2

을 준다. 전화 할 때목표 C의 performselector는 I는 다음 인터페이스와 <strong>직사각형</strong> 개체가 가비지 값

[r setWidth: 5 andHeight: 6]; 

[r height]을 통해 올바른 결과를 얻을 수 있습니다. 내가 performselector을 사용하고 그러나 동일한 작업을 수행합니다 :

NSNumber *myNumber = [NSNumber numberWithInt:45]; 
[r performSelector:@selector(setWidth:andHeight:) withObject:myNumber 
      withObject:myNumber]; 

[r height] 인쇄 일부 쓰레기 값 (일부 주소 모양) 원자바오가 예상 값은 내가 잘못 뭘 오전 45 인을 호출?

+3

이'NSNumber'가 int''과 동일하지 않습니다. 당신의 메소드는'NSNumber' 객체를 매개 변수로 사용하지 않습니다. 왜 BTW - 왜 직접 performSelector' 메서드를 호출하는 대신 사용하고 있습니까? – rmaddy

+0

그냥 지원되지 않습니다. –

+0

@maddy, 특별한 이유없이, 단지 실험. – SexyBeast

답변

3

performSelector는 모든 인수에 객체 유형이있는 메소드를 호출하는 데만 사용할 수 있습니다. 메서드에 정수 매개 변수가있는 경우 performSelector를 사용할 수 없습니다.

+1

... 그리고 비 객체 매개 변수로 간접적으로 메소드를 호출해야한다면'NSInvocation'을 사용하십시오. –

+0

예 @ gnasher729, 나는 그것을 배웠다. 그러나 함수의 서명을 대신 NSNumbers를 받아들이도록 변경할 수 있으며 그 내부에서 실제 정수 값을 파생시킬 수 있다고 언급 할 수 있습니다. 그게 효과가있다. – SexyBeast

2

gnasher가 말했듯이, 그렇게 할 수 없습니다. NSInvocation을 사용하거나 GCD와 블록을 사용할 수 있습니다.

1

비슷한 문제가있어 NSInvocation을 사용하여 해결했습니다. 이 말의되었다하더라도 다음과 같은
코드 뭔가 일을해야합니다

SEL selector = NSSelectorFromString(@"setWidth:andHeight:"); 
NSMethodSignature *signature = [r methodSignatureForSelector:selector]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setSelector:selector]; 
int x = 5; 
int y = 6; 
[invocation setArgument:&x atIndex:2]; // 0 and 1 are reserved 
[invocation setArgument:&y atIndex:3]; 
[invocation invokeWithTarget:r];