我正在用Objective-C编写一个OpenStruct的克隆,使用forwardInvocation:。然而,编译器显然没有意识到编译时的转发。使用ARC编译会给我大量的警告。
代码是开源的,可以在Github上获得,但目前是使用-fno-objc-arc.编译的。如果有人能看看我如何使这个ARC兼容,我将不胜感激。
发布于 2011-11-03 22:21:14
我试过这段代码:
OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary];
NSLog(@"%@ says %@", @"Cow", [myStruct cowSound]);
无论是否使用ARC,使用LLVM3.0或LLVM GCC 4.2,我都会收到警告或错误。我认为您误解了forwardInvocation:仍然需要在某种级别上声明方法,即使只是在您要发送消息的类的类别(@interface)中声明。
例如,当您这样做时:
[someObject doSomething];
如果没有在任何地方声明doSomething,那么这至少会生成一个警告("someObject可能不会响应doSomething"),而不管someObject类是否实现了forwardInvocation。正如您所注意到的,编译器确实没有意识到转发,而且它也不能依赖您的forwardInvocation实现来保证消息传递。无论有没有ARC,LLVM3.0都可能会产生错误,因为ARC的开发目标是在更多的编译器错误方面出错,而不是运行时问题。
现在,您仍然可以向没有实现方法的对象发送消息。例如,通过使用Objective-C运行时方法objc_msgSend或通过NSInvocation。但这使您计划创建的简单易用的界面变得空洞。
顺便说一句,您的OpenStruct使用示例并没有真正证明为什么与struct getValueForKey:@"moo";…这样的简单访问器相比,通过消息传递访问动态结构更简单。如果你仔细考虑过这一点,那么struct moo比第一种方法给用户带来的好处很少,甚至没有好处。"moo“方法是动态的(字符串或转发的消息),并且不会在运行时捕获拼写错误。
https://stackoverflow.com/questions/7858980
复制