4

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

有没有一种方法可以在不执行以下操作的情况下为方法创建别名:

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

我想通过创建别名[self method2];来等同。[self method1];这在Objective-C中可能吗?

4

2 回答 2

4

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

大多数时候,你只会做你想要避免的事情。这很容易而且很有效。

但是当这还不够好时,Obj-C 运行时有一个称为“消息转发”的功能。

基本上,如果您的对象收到一条它不知道的消息(方法调用),则默认行为是抛出异常。但是您的对象可以选择用它做其他事情,并且有数百万个 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

于 2013-09-01T03:05:18.473 回答
0

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

class_addMethod不会替换,但其他 API 可以 - 注意不要替换现有的实现。选择器名称的好前缀是个好主意,这样可以避免冲突。

于 2013-09-01T07:47:02.347 回答