-forwardInvocation 와 함께 작동하고 최적화를 하는 c 컴파일러 LLVM 하지만 GCC

StackOverflow https://stackoverflow.com/questions/1451970

  •  12-09-2019
  •  | 
  •  

문제

다음 코드를 구현하는 NSProxy 서브 클래스는 전달하는 방법을 NSNumber 인스턴스입니다.

그러나를 호출할 때[nsproxy floatValue]나 0.0 에서 GCC4.2.

아래에 LLVM-그램을 받을 정답 42.0.

어떤 생각이 무엇이죠?

(참고로 이것은 실행 가비지 컬렉션)

-(id) init;
{
    _result = [NSNumber numberWithFloat:42.0];
    return self;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    return [[_result class] instanceMethodSignatureForSelector:aSelector];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    [anInvocation setTarget:_result];
    [anInvocation invoke];
    return;
} 
도움이 되었습니까?

해결책

프록시 클래스를 선언하지 않는 메시지 서명을 위한 -floatValue.이후 반환합니다 부동 소수점 코드를 사용하는 것은 권장하지 않는 것이 문제가 될 수 있습니다.지 않았기 때문에 그것을 선언했 어디서나 아마도 없는 주조하는 프록시는 개체를 해'로 표현 클래스 컴파일러는 추측에서 방법을 서명이 있습니다.이 경우에는 GCC 컴파일러 추측하는 메시지를 반환합니다 id 포인터이다.

하는 것을 목적에 따라,서명의 메시지와 건물,기계의 다른 기능을 사용에 대한 메시지를 처리하고 그 값을 반환합니다.On x86 기계 메시지를 반환하는 부동 소수점 값를 통해 불 objc_msgSend_fpret 면서 반환하는 함수 voididobjc_msgSend.

이후 GCC 컴파일러는 가정을 반환하는 값이 id 이용 후기 기능을 잘못 처리 결과입니다.는 그 소리는 처리할 수 있 이것이 제대로 흥미롭지만 저는 것을 망설일에 의존하는 동작입니다.더 나은 것을 선언한 범주에 대한 프록시는 어떤 방법을 것을 전달했다.또한 혜택을 제거하고 있다는 경고가 생성되는 라인의 코드를 호출하 floatValue 방법입니다.

@interface Foo (ProxyMethods)
- (float)floatValue;
@end

다른 팁

어느 init 방법은 호출해야합니다 [super init]; 예상치 못한 행동을 방지합니다. 그렇게 :

- (id)init {
    self = [super init];
    if (self) {
        // Your init code
    }
    return self;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top