Objective-C方法名称别名

时间:2013-09-01 02:09:39

标签: ios objective-c

我有一个相当简单的问题,我似乎无法找到明确的答案。

有没有办法为方法创建一个别名,而不用做这样的事情:

- (void)method1
{ //Stuff }
- (void)method2
{ [self method1];}

我希望[self method2];通过创建别名来等同于[self method1];。这在Objective-C中是否可行?

2 个答案:

答案 0 :(得分:3)

如果你正在寻找一种方法来做到这一点而不需要编写很多代码,那你就不走运了。根据经验,Obj-C没有太多“语法糖”,这就是其中一种情况。

大多数时候,你只会做你想要避免的事情。这很简单,也很有效。

但是当这还不够好时,Obj-C运行时有一个名为“Message Forwarding”的功能。

基本上,如果您的对象收到一条它不知道的消息(方法调用),则默认行为是抛出异常。但是你的对象可以选择用它来做其他事情,并且有数百万个Obj-C框架类这样做的地方。

大多数情况下,您将邮件“转发”到另一个对象,但您可以执行任何操作:

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    if (/* some check */) {
        /* do something */
        return;
    }

    // perform the superclass's implementation (which is probably to throw a "method not recognized" exception.
    [super forwardInvocation:anInvocation];
}

可在此处找到包含更多详细信息的官方文档:https://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

答案 1 :(得分:0)

如果您可以使用动态解决方案,则可以使用objc运行时。 class_addMethod是一个可以为您执行此操作的API。

class_addMethod不会替换,但其他API可以 - 小心不要替换现有的实现。选择器名称的良好前缀是个好主意,这样您就可以避免碰撞。