NSObject
문서를 살펴보십시오.
[parent performSelector:sel withObject:[NSNumber numberWithInt:i]];
(이 방법은 실제로 NSObject
protocol 문서에 나와 있습니다) :이 경우. -[NSObject performSelector:withObject:]
객체 인수를 필요로하기 때문에, 당신은 NSNumber
을 언 박싱하는
-(void)myMethodForNumber:(NSNumber*)number {
[self myMethod:[number intValue]];
}
처럼 부모의 클래스 래퍼를 작성해야합니다.
실제로 비 개체 인수를 사용하는 메서드를 호출하려는 경우 (예를 들어, 호출 수신자를 제어하지 않고 범주를 추가하지 않으려는 경우) NSInvocation
:
을 사용할 수 있습니다
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
메서드가 init
인 것처럼 보이지만 Objective-C의 올바른 초기화 프로그램 패턴을 따르지 않습니다. 수퍼 클래스 이니셜 라이저를 호출해야하며 해당 호출에서 nil
결과를 테스트해야하며 이니셜 라이저 메서드에서 self를 반환해야합니다. (가 init 메소드의 경우) 다음과 같을 것이다
-(id)myInitMethod {
self = [super init];
if(self != nil) {
//perform initialization of self
}
return self;
}
귀하의 방법 : 모든 경우에, 당신의 목표 - C 초기화 방법이 같아야합니다
-(id) init: (SEL)sel owner:(NSObject*) parent
{
self = [super init];
if(self != nil) {
int i = 10;
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[parent methodSignatureForSelector:sel]];
[inv setSelector:sel];
[inv setTarget:parent];
[inv setArgument:&i atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
[inv invoke];
}
return self;
}
이 문체 더 오브젝티브 C가 될, 나는 이니셜 라이저 -(id)initWithSelector:owner:
의 이름을 바꿀 것입니다.
감사합니다. NSInvocation을 사용해야 할 수도 있지만 확실하지는 않다고 생각했습니다. 좋은 대답. – madmik3
참고로, 호출 수신자를 제어 할 수 없더라도 해당 클래스의 카테고리를 사용하여 래퍼 메소드를 작성하여 객체를 기본 유형으로 unbox 할 수 있습니다. –
좋은 지적, 에드. –