我正在使用OpenStruct在Objective-C中编写forwardInvocation:的克隆。但是,编译器显然不知道编译时的转发。用ARC编译给了我很多警告。
代码是开源的,可在Github上获得,但目前使用-fno-objc-arc进行编译。如果有人可以看看我如何使这个ARC兼容,我会非常感激。
答案 0 :(得分:3)
我试过这段代码:
OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary];
NSLog(@"%@ says %@", @"Cow", [myStruct cowSound]);
使用LLVM 3.0或LLVM GCC 4.2,无论是否使用ARC,都会收到警告或错误。我认为你误解了forwardInvocation:仍然需要在某个级别声明方法,如果只是在你要发送消息的类的类别(@interface)中。
例如,当你这样做时:
[someObject doSomething];
如果doSomething未在任何地方声明,那么这将始终至少生成警告(“someObject可能不响应doSomething”),无论someObject类是否实现forwardInvocation。就像你注意到的那样,编译器确实不知道转发,它也不能依赖你的forwardInvocation实现保证消息传递。对于带有或不带ARC的LLVM 3.0,这可能已被更改为生成错误,因为ARC的开发目标是更多的编译器错误而不是运行时问题。
现在,您仍然可以向未实现方法的对象发送消息。例如,通过使用Objective-C运行时方法objc_msgSend或通过NSInvocation。但这会使您计划创建的简单易用的界面无效。
顺便说一句,你的OpenStruct用法示例并不能证明为什么通过消息传递访问动态结构更简单,而不像[struct getValueForKey:@“moo”]这样的简单访问器。 ...如果你认为这一点[struct moo]给予用户很少或没有超过第一种方法的好处。 “moo”方法是动态的(字符串或转发消息),并且在运行时不会捕获拼写错误。