2012-10-09 4 views
1

나는 다음과 같은 문제가 그것을 해결할 수없는, 아마도 누군가가아이폰 OS - ... performselector

주요 목적은이 다를 수 있기 때문에, 동적이어야합니다 :) 트릭을 알고에 대한 참조를 전달

호출 할 필요가

기능 : 코드가 이미 선언으로

+ (NSArray *)parseJSONString:(NSString *)theJSONString error:(NSError **)errorPointer 

, 내가 JSON을 구문 분석합니다.

... withObject:&parsingError -> compile error 
... withObject:[NSValue valueWithPointer:&parsingError] -> works until the value will be redirect to the parsingError -> Bad Exec 

I :

은 이미 다음을 시도 ...

if ([[self.theObject class] respondsToSelector:@selector(parseJSONString:error:)]) { 
    NSError *parsingError = nil; 
    self.myObjectsCollection = [[self.theObject class] performSelector:@selector(parseJSONString:) 
                  withObject:utf8ResponseString 
                  withObject:parsingError];   
} 

utf8ResponseString는 JSON을 포함 : 나는이 performSelector 방법을 사용하여 그 이유는,이 기능을 구현하는 여러 개체가 하루를 찾고 심지어 이것을 해결하는 방법에 clou도 없어 - 도와주세요 ...

감사 및 인사, mathew

+0

내가 프로토콜을 사용하고 –

답변

2

performSelector:... 패밀리는 객체 인수 만 취합니다. 객체와 같은 포인터가 아닌 포인터를 전달하려고하므로 유형 시스템에서 허용하지 않습니다. 다행히도 여기에 performSelector:이 필요하지 않습니다. [[self.theObject class] parseJSONString:utf8ResponseString error:&parsingError]을 할 수 있습니다.

전송할 메시지를 런타임까지 알 수없는 경우에만 performSelector:을 사용해야합니다. 변수를 첫 번째 인수로 전달하지 않으면 아마도 필요하지 않을 것입니다.

그러나이 작업을 수행해야 할 경우, 객체 (예 : NSValue)를 가져 와서 비 객체 유형의 실제 메소드를 호출하는 "래퍼"메소드를 작성해야합니다. performSelector:withObject:으로 실제 메소드 대신 래퍼를 호출 할 수 있습니다.

+0

완벽한 덕분에 위임 할 것이다 : -object 인수 후 적절한 솔루션이 될 것입니다! – user617965

1

왜 직접 클래스의 메서드를 호출하지 않습니까? 메소드에 응답 할 수 있는지 이미 확인했습니다. 따라서 메소드를 직접 호출하십시오.

[[self.theObject class] parseJSONString: nil error: &error]. 

그런데 단순한 상태 패턴 교체를 할 수 있습니다. 객체 응답자가 런타임에 정의 되더라도 메시지 호출은 정의되지 않습니다. 컴파일러가 경고한다면 Transtype을 id로 설정하십시오. 클래스 메서드에 프로토콜을 할당 할 수 있는지 확신 할 수 없기 때문입니다. (하지만 아마도 할 수 있습니다).

심지어 모든 파서를 프록시 파서 Class에 포함하여 컴파일 타임에 정의 할 수도 있습니다.

확실한 것은 포인터 객체 (** erorr)에 대한 포인터를 performSelector :: (런타임이 soothsayer가 아니기 때문에) 전달할 수 있다는 것입니다. 정말로 필요한 경우 간단한 c 함수 호출을 수행하십시오.

+0

고마워요! – user617965

4

완성도에 대한 다른 답변을 추가하려면 런타임에 이름 만 알려진 메서드를 동적으로 호출해야하는 경우 (이 경우에는 필요하지 않지만 실제로는 필요하지 않습니다.)

  • 가있는 NSInvocation를 사용하거나
  • 호출 objc_msgSend... 런타임 기능 중 하나는 바로
+0

그리고 너도! 그것도 시도해 봤는데 ... – user617965