reb*_*ebo 4 gcc objective-c llvm clang
以下代码实现了一个NSProxy子类,它将方法转发给NSNumber实例.
但是当调用[nsproxy floatValue]时,我在GCC 4.2下得到0.0.
在LLVM-Clang下我得到正确的答案42.0.
知道发生了什么事吗?
(顺便说一下,这是在Garbage Collection下运行的)
-(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;
}
Run Code Online (Sandbox Code Playgroud)
您的代理类未声明消息签名-floatValue
.由于它返回浮点数,这可能是个问题.因为你没有在任何地方声明它,并且可能没有将你的代理对象转换为它所代表的类,所以编译器必须猜测方法签名.在这种情况下,GCC编译器猜测消息将返回id
指针.
在Objective-C中,根据消息的签名和机器的体系结构,使用不同的函数来处理消息及其"返回值".在x86机器上objc_msgSend_fpret
,返回void
和id
使用的函数会调用返回浮点值的消息objc_msgSend
.
由于GCC编译器假设返回值是a,id
它使用后者函数并错误地处理结果.Clang能够正确处理这个问题很有意思,但我会毫不犹豫地依赖这种行为.最好在您的代理上为您要转发的任何方法声明一个类别.这也有利于删除为调用该floatValue
方法的代码行生成的警告.
@interface Foo (ProxyMethods)
- (float)floatValue;
@end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
308 次 |
最近记录: |