gpt4 book ai didi

objective-c - -forwardInvocation 适用于 Clang - LLVM 但不适用于 GCC

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:54 25 4
gpt4 key购买 nike

以下代码实现了一个 NSProxy 子类,它将方法转发给一个 NSNumber 实例。

然而,在调用 [nsproxy floatValue] 时,我在 GCC 4.2 下得到 0.0。

在 LLVM-Clang 下我得到正确答案 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 声明消息签名。因为它返回一个 float ,所以这可能是个问题。因为您没有在任何地方声明它,并且可能没有将您的代理对象转换为其代表的类,所以编译器必须猜测方法签名。在这种情况下,GCC 编译器会猜测该消息将返回一个 id 指针。

在 Objective-C 中,根据消息的签名和机器的体系结构,使用不同的函数来处理消息及其返回值。在 x86 机器上,返回浮点值的消息通过 objc_msgSend_fpret 调用,而返回 voidid 的函数使用 objc_msgSend.

由于 GCC 编译器假定返回值是 id,因此它使用了后一个函数并错误地处理了结果。 Clang 能够正确处理这个问题很有趣,但我不愿意依赖这种行为。最好在您的代理上为您要转发的任何方法声明一个类别。这还有一个好处,即删除为调用 floatValue 方法的代码行生成的警告。

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

关于objective-c - -forwardInvocation 适用于 Clang - LLVM 但不适用于 GCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1451970/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com