首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-forwardInvocation与Clang - LLVM合作,但不与GCC合作

-forwardInvocation与Clang - LLVM合作,但不与GCC合作
EN

Stack Overflow用户
提问于 2009-09-20 20:47:27
回答 2查看 317关注 0票数 4

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

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

在LLVM-Clang下,我得到了正确答案42.0。

知道这是怎么回事吗?

(顺便说一下,这是在垃圾收集下运行的)

代码语言:javascript
复制
-(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;
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-21 07:10:52

您的代理类没有为-floatValue声明消息签名。因为它返回一个浮点数,所以这可能是一个问题。因为您没有在任何地方声明它,并且可能没有将您的代理对象强制转换为它所表示的类,所以编译器必须猜测方法签名。在这种情况下,GCC编译器猜测消息将返回一个id指针。

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

因为GCC编译器假设返回值是一个id,所以它使用后一个函数并不正确地处理结果。Clang能够正确处理这一点很有趣,但我不愿依赖于这种行为。最好在你的代理上为你将要转发的任何方法声明一个类别。这样做的好处还在于消除了为调用floatValue方法的代码行生成的警告。

代码语言:javascript
复制
@interface Foo (ProxyMethods)
- (float)floatValue;
@end
票数 6
EN

Stack Overflow用户

发布于 2012-03-11 07:28:44

任何init方法都应该调用[super init];以防止意外行为。因此:

代码语言:javascript
复制
- (id)init {
    self = [super init];
    if (self) {
        // Your init code
    }
    return self;
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1451970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档