2011-12-19 2 views
3

나는 다음과 같은 예제 코드와 선택기를 호출 할 수 있도록 내가, 디스패치 테이블을 구현하기 위해 노력하고있어 :: 어떻게 선택기의 배열을 선언하는

NSInteger i = 2; 
[myObject performSelector:selectors[i]]; 

I API의 메소드가 호출 될 때 영향을주는 사용자 환경 설정을 저장하려고합니다. 지금은 선택기의 문자열 이름을 사용하고 NSSelectorFromString을 사용합니다.하지만 약간 지저분합니다. 디스패치 테이블을 사용하면 대신 enum을 저장할 수 있습니다.

Objective-C에서 선택기 배열이나 디스패치 테이블을 만들려면 어떻게해야합니까?

편집 :

내가 속성으로 선택기의 배열을 설정하려고하면 컴파일러가 불평. @property SEL[]은 컴파일되지 않습니다.

Edit2가 :

내가 my KosherCocoa API 라이브러리를 사용하고 내가 저장된 사용자 설정에 따라, 한 번에 하나의 메소드를 호출합니다. Plist 파일에 저장 중이며 Plist 파일에서 읽는 중입니다.

+0

대신 전략 패턴이 도움이 될 것입니다. http://en.wikipedia.org/wiki/Strategy_pattern –

답변

3

SEL 유형을 사용하여 선택자를 유지할 수 있습니다. 간단히 :

SEL dispatchTable[3] = { @selector(doThis:), 
         @selector(doThat:), 
         @selector(doTheOther:) 
         }; 

하여 편집하려면, 대신 속성으로 선택기 등 NSArray/NSDictionary를/사용합니다. Objective C에서는 C 배열을 속성으로 사용할 수 없습니다. 그들은 ObjC 객체, CF 유형 및 기본 C '일반 올드 데이터'유형 인 지원되는 유형 중 하나가 아닙니다.

OK, 아래의 설명에서 선택자를 NSValue으로 감쌀 필요가 있습니다.

NSMutableArray * dispatchTable2 = [[NSMutableArray alloc] initWithCapacity:3]; 
SEL selIn = @selector(doThis:); 

// Wrap the selector in an NSValue instance 
[dispatchTable2 addObject:[NSValue valueWithPointer:selIn]]; 

// On extracting: 
NSValue * valOut = [dispatchTable2 objectAtIndex:0]; 
SEL selOut = [[dispatchTable2 objectAtIndex:0] pointerValue]; 
[anObject performSelector:selOut]; 

이제 테이블은 속성이나 바르로 저장된 objc 용기, 그리고 당신이 valueWithPointer:와 함께 SEL 포인터를 포장 NSValue를 사용 (SEL는 C 포인터 형이기 때문에)는 objc 용기에 사용하는 pointerValue으로 SEL을 해결하십시오.

+0

실제로 배열에 선택기를 사용하는 데 문제가 있습니다. 작동하지 않는 것 같습니다. "호환되지 않는 포인터"경고가 나타납니다. – Moshe

+2

일부 코드에서 문제의 예를 게시 할 수 있습니까? 셀렉터 배열을 선언 할 때 아무 문제가 없습니다. –

+0

분명히 범위에 따라 다릅니다. 배열에 메서드를 붙여 넣을 때 괜찮 았지만, 메서드 밖에서 구현에 넣으면 불평합니다. – Moshe

2

선택자 대신 NSInvocation을 사용하는 것이 좋습니다. 같은 객체를 여러 객체에 보낼 수 있고 객체의 속성을 변경할 수 있기 때문에 훨씬 유연합니다. 그런 당신을 위해 가독성을 증가하는 경우이 작업을 수행하는

+1

또한 성능면에서 매우 비쌉니다 ... –

+0

다른 방법보다 더 비쌉니다. _ 비싼 비싼? 어떻게 자격을 얻었습니까? –

+1

@Moshe에서 더 많은 정보를보고 싶습니다. 올바른 해결책은 문제에 달려 있습니다. –

1

한 가지 방법은

를 사용
NSString *selectors[] = { ... } 

[myObject performSelector:NSSelectorFromString(selectors[i])]; 

이 속성으로이를 사용하려면 .. 다음 실행시에 SELS에 그 변환, NSStrings의 배열을 사용하고 있습니다
@property(nonatomic, assign) NSString **selectors; 
+0

단지 레코드 용으로'@property (nonatomic, assign) NSString ** 선택자를 사용하여 시도했다;'명시 적 소유권이없는 non-const 유형 NSString *에 대한 포인터를 제공한다 '반면'@property (nonatomic, assign) void ** 셀렉터; – thesummersign

관련 문제