gpt4 book ai didi

objective-c - 使用 ARC 访问 forwardInvocation 的方法?

转载 作者:行者123 更新时间:2023-12-04 06:10:12 24 4
gpt4 key购买 nike

我正在写 OpenStruct 的克隆在 Objective-C 中,使用 forwardInvocation: .但是,编译器显然不知道编译时的转发。用 ARC 编译给了我很多警告。

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

最佳答案

我试过这个代码:

OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary];
NSLog(@"%@ says %@", @"Cow", [myStruct cowSound]);

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

例如,当您执行以下操作时:
[someObject doSomething];

然后,如果 doSomething 未在任何地方声明,无论 someObject 类是否实现 forwardInvocation,这将始终至少生成一个警告(“someObject 可能不会响应 doSomething”)。正如您所注意到的,编译器确实不知道转发,它也不能依靠您的 forwardInvocation 实现来保证消息传递。对于带有或不带有 ARC 的 LLVM 3.0,这可能已更改为生成错误,因为 ARC 的开发目标是在更多编译器错误而不是运行时问题方面出错。

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

顺便说一句,与像 [struct getValueForKey:@"moo"] 之类的简单访问器相比,您对 OpenStruct 的使用示例并不能真正证明为什么通过消息传递访问动态结构更简单; ...如果您考虑过这一点,那么 [struct moo] 与第一种方法相比几乎没有或没有给用户带来任何好处。 "moo"方法无论哪种方式都是动态的(字符串或转发的消息),并且不会在运行时捕获拼写错误。

关于objective-c - 使用 ARC 访问 forwardInvocation 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7858980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com