iOS 메시지 전달
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([someOtherObject respondsToSelector: [anInvocation selector]])
{
[anInvocation invokeWithTarget:someOtherObject]; // ,someOtherObject 。
}
else
{
[super forwardInvocation:anInvocation];
}
}
forwardInvocation: 방법은 식별되지 않은 메시지 배달 센터의 역할을 맡고 있습니다.너는 이 방법에서 식별되지 않은 소식을 이 소식을 처리할 수 있는 대상에게 전달해야 한다.주의: 대상이 어떤 메시지에 응답하지 못할 때만 이 메시지는forwardInvocation: 에 도착합니다.예를 들어 당신의 대상이 다른 대상에게 negotiate 메시지를 전달하고 싶다면, 그 자체가 negotiate 메시지에 응답할 수 있는 negotiate 방법을 가지고 있을 수 없다.만약 그 자신이 이런 방법을 가지고 있다면, 이negotiate 메시지는 영원히 forward Invocation: 에 도착하지 않을 것이다.
한 대상이 메시지를 전달해서'처리할 수 없을 것 같은'메시지에 도달할 수 있지만, -(BOOL)respondsToSelector:(SEL)aSelector 방법을 통해 이 방법은 여전히 NO로 되돌아온다.만약 당신의 대상을 다른 대상에게 계승하는 것처럼 보이고 싶다면, 예를 들어 양-(BOOL)respondsToSelector: (SEL)aSelector 방법을YES로 되돌려보내려면, 다시 쓰기-(BOOL)respondsToSelector: (SEL)aSelector 방법.
- (BOOL)respondsToSelector:(SEL)aSelector
{
if ( [super respondsToSelector:aSelector] )
return YES;
else {
/* Here, test whether the aSelector message can *
* be forwarded to another object and whether that *
* object can respond to it. Return YES if it can. */
}
return NO;
}
다시 쓰는 방법과 비슷한 방법은 In addition to responds To Selector: and isKind OfClass:, the instances Respond To Selector: method should also mirror the forwarding algorithm.If protocols are used, the conformsToProtocol: method should likewise be added to the list.
메시지를 전달하는 정확성을 확보하기 위해서methodSignatureForSelector: 방법을 다시 써야 합니다.
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature *signature = [super
methodSignatureForSelector:selector];
if (!signature) {
signature = [surrogate methodSignatureForSelector:selector];
}
return signature;
}
총괄적으로 메시지 전달은 상기 세 가지 방법을 다시 써야 한다.그 중에서methodSignatureForSelector:와forwardInvocation: 다시 써야 합니다.실행 순서는methodSignatureForSelector:그리고forwardInvocation:.forward Invocation만 다시 쓰기: 소용없습니다. 붕괴될 것입니다.대상이 어떤 방법을 처리할 수 없을 때, 다시 쓰기 - (NSMethodSignature*) methodSignatureForSelector: (SEL) selector가 있으면 시스템이 이 방법을 호출합니다.위 signature = [surrogate methodSignatureForSelector:selector];되돌아오는 것은nil입니다. 즉, 다른 대상도 이 방법을 울리지 못하면 forwardInvocation: 방법을 실행하기 전에 붕괴됩니다. forwardInvocation: 방법의 매개 변수는methodSignatureForSelector: 의 되돌아오는 값을 바탕으로 만들어졌기 때문입니다.
다시 쓰는 방법, 사인하는 방법이 무슨 소용이 있습니까?
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
methodSignatureForSelector 리셋을 통해 다른 대상이 전송될 메시지에 정말 응답할 수 있는지 미리 판단할 수 있습니다.NO로 돌아가면 forward Invocation: 방법을 실행하지 않아도 됩니다.메시지 전달을 통해 간단한 붕괴 방지를 할 수 있다.예를 들어 NSArray를 다시 쓰는 방법.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.