2

我想以编程方式将代码与选择器相关联。我不清楚如何在 Objective C 中做到这一点。在 Ruby 中,我可能会覆盖method_missing. 在 Common Lisp 中,我可能会定义一个宏。在Objective C中,我可以通过属性获得部分方式@dynamic,但我不清楚如何实际实现它们。

这是一个具体的例子:我想使用一个NSMutableDictionary来持久地存储我的对象的一部分。我的类有两种处理基本功能的方法,以及一堆动态属性(匹配@propertys 存在于 中@interface):

@dynamic name;
@dynamic age;
@dynamic favoriteColor;
- (id)accessor:(NSString*)name {
    return [[self dict] objectForKey:name];
}
- (void)mutator:(NSString*)name value:(id)value{
    [[self dict] setObject:value forKey:name];
    [[self dict] writeToFile:[self filename] atomically:YES];
}

现在我正在寻找一种方法来翻译像这样的电话

[myInstance setName:@"iter"];

进入

[self mutator:@"name" value@"iter"];

我想知道在 ObjC 中是否有一种惯用的方式来做到这一点。

4

3 回答 3

2

在 Objective-C 中,这并不是真正的惯用做法,而且肯定没有像 Lisp 宏那样可用的东西。NSObject但是,运行时确实为您提供了三个可能的点来拦截和处理引用不存在的方法的消息。按照运行时使用它们的顺序resolveInstanceMethod:forwardInvocation:doesNotRespondToSelector:。他们每个人的文档解释了他们的使用并给出了一些例子。

第一个要求您实际编写并向类添加一个方法,这似乎不会实现您想要的动态状态。最后一个默认情况下会引发异常并且不提供任何返回值。几乎可以肯定,forwardInvocation这是您想要调查的内容。它允许您的对象请求另一个对象处理方法调用,包括传递的参数;你应该可以让你的对象以至少让你接近你想要的方式来处理调用本身。

此外,运行时编程指南的“消息转发”一章提供了一些与您的要求类似的任务示例。

于 2011-07-18T03:53:33.863 回答
1

如果一个对象没有您调用的方法,您可以重写forwardInvocation以将方法调用委托给另一个对象。

于 2011-07-18T03:48:33.013 回答
0

您可以将Objective-C 运行时函数resolveInstanceMethod:. resolveInstanceMethod:文档中有一个简短的示例。

于 2011-07-18T03:49:03.317 回答