- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
以下代码实现了一个 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
调用,而返回 void
和 id
的函数使用 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/
我经常这样做: CoolViewController *coolViewController = [[CoolViewController alloc] init]; [self.navigation
我无法让 forwardInvocation 工作。出于某种原因,Objective-C 运行时完全忽略了我的 forwardInvocation: 方法并抛出无法识别的选择器异常。 我的测试代码如下
我有一个 facade我想将一些类方法调用转发给一些“静态”类的单例。 乍一看,forwardInvocation: 似乎是一个可能的解决方案,然而,NSInvocation 的 invokeWith
我正在努力通过外观类转发类方法。 为了澄清,我重写了以下所有方法: -(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector -(
我有一个问题。 我有方法 - (void)forwardInvocation:(NSInvocation *)anInvocation { SEL sel = anInvocation.selecto
对 objective-c 很陌生,但我遇到了一种似乎很常见的情况:我希望 ClassA 要求 ClassB 在只有 ClassB 知道的对象上执行一个方法(并且还使用了一个方法是A 级不知道)。 我
为了学习,我正在尝试更改在对象上调用的方法。 这是我的代码。 #import @interface A : NSObject -(void) say: (NSString*) s; -(NSMeth
仅查看 Objective-C 运行时库,当消息发送到不响应它的对象时,运行时系统会为接收方提供另一个机会来处理该消息。因此,接收方的 forward:: 方法(如果已实现)将被调用。然而,看着NSO
我正在获取 [_WebSafeForwarder forwardInvocation:] 和关于 crashlytics 的崩溃报告。无法在我的代码中重现相同的情况。我在每个 -(void)deall
我正在写 OpenStruct 的克隆在 Objective-C 中,使用 forwardInvocation: .但是,编译器显然不知道编译时的转发。用 ARC 编译给了我很多警告。 该代码是开源的
我有一个正在转发接收消息的对象。它不使用 forwardInvocation 实现将它们转发给其他对象。但是,由于程序的组织方式,methodSignatureForSelector 在某些时候并不总
我有一个正在转发接收消息的对象。它不使用 forwardInvocation 实现将它们转发给其他对象。但是,由于程序的组织方式,methodSignatureForSelector 在某些时候并不总
这是我的代码的一部分: - (void)viewDidLoad { [super viewDidLoad]; CGRect frame = [[UIScreen mainScreen]
以下代码实现了一个 NSProxy 子类,它将方法转发给一个 NSNumber 实例。 然而,在调用 [nsproxy floatValue] 时,我在 GCC 4.2 下得到 0.0。 在 LLVM
这是我用来测试行为的独立 test.m 文件。 编译:clang test.m -o test.app -fobjc-arc -ObjC -framework Foundation。确保已安装 Xco
我是一名优秀的程序员,十分优秀!