首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用ARC访问forwardInvocation方法?

使用ARC访问forwardInvocation方法?
EN

Stack Overflow用户
提问于 2011-10-22 18:53:59
回答 1查看 1.1K关注 0票数 2

我正在用Objective-C编写一个OpenStruct的克隆,使用forwardInvocation:。然而,编译器显然没有意识到编译时的转发。使用ARC编译会给我大量的警告。

代码是开源的,可以在Github上获得,但目前是使用-fno-objc-arc.编译的。如果有人能看看我如何使这个ARC兼容,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-04 06:21:14

我试过这段代码:

代码语言:javascript
代码运行次数:0
运行
复制
OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary];
NSLog(@"%@ says %@", @"Cow",  [myStruct cowSound]);

无论是否使用ARC,使用LLVM3.0或LLVM GCC 4.2,我都会收到警告或错误。我认为您误解了forwardInvocation:仍然需要在某种级别上声明方法,即使只是在您要发送消息的类的类别(@interface)中声明。

例如,当您这样做时:

代码语言:javascript
代码运行次数:0
运行
复制
[someObject doSomething];

如果没有在任何地方声明doSomething,那么这至少会生成一个警告("someObject可能不会响应doSomething"),而不管someObject类是否实现了forwardInvocation。正如您所注意到的,编译器确实没有意识到转发,而且它也不能依赖您的forwardInvocation实现来保证消息传递。无论有没有ARC,LLVM3.0都可能会产生错误,因为ARC的开发目标是在更多的编译器错误方面出错,而不是运行时问题。

现在,您仍然可以向没有实现方法的对象发送消息。例如,通过使用Objective-C运行时方法objc_msgSend或通过NSInvocation。但这使您计划创建的简单易用的界面变得空洞。

顺便说一句,您的OpenStruct使用示例并没有真正证明为什么与struct getValueForKey:@"moo";…这样的简单访问器相比,通过消息传递访问动态结构更简单。如果你仔细考虑过这一点,那么struct moo比第一种方法给用户带来的好处很少,甚至没有好处。"moo“方法是动态的(字符串或转发的消息),并且不会在运行时捕获拼写错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7858980

复制
相关文章

相似问题

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