下面的代码实现了一个将方法转发给NSNumber实例的NSProxy子类。
然而,在调用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;
} 发布于 2009-09-21 07:10:52
您的代理类没有为-floatValue声明消息签名。因为它返回一个浮点数,所以这可能是一个问题。因为您没有在任何地方声明它,并且可能没有将您的代理对象强制转换为它所表示的类,所以编译器必须猜测方法签名。在这种情况下,GCC编译器猜测消息将返回一个id指针。
在Objective-C中,根据消息的签名和机器的体系结构,使用不同的函数来处理消息及其返回值。在x86机器上,返回浮点值的消息通过objc_msgSend_fpret调用,而返回void和id的函数使用objc_msgSend。
因为GCC编译器假设返回值是一个id,所以它使用后一个函数并不正确地处理结果。Clang能够正确处理这一点很有趣,但我不愿依赖于这种行为。最好在你的代理上为你将要转发的任何方法声明一个类别。这样做的好处还在于消除了为调用floatValue方法的代码行生成的警告。
@interface Foo (ProxyMethods)
- (float)floatValue;
@end发布于 2012-03-11 07:28:44
任何init方法都应该调用[super init];以防止意外行为。因此:
- (id)init {
self = [super init];
if (self) {
// Your init code
}
return self;
}https://stackoverflow.com/questions/1451970
复制相似问题