2

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

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

4

1 回答 1

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 类是否实现 forwardInvocation,这将始终至少生成一个警告(“someObject 可能无法响应 doSomething”)。正如您所注意到的,编译器确实不知道转发,它也不能依赖您的 forwardInvocation 实现保证消息传递。对于带有或不带有 ARC 的 LLVM 3.0,这可能已更改为生成错误,因为 ARC 的开发目标是在更多编译器错误而不是运行时问题方面犯错。

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

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

于 2011-11-03T22:21:14.110 回答