我有一个相当简单的问题,我似乎找不到明确的答案。
有没有一种方法可以在不执行以下操作的情况下为方法创建别名:
- (void)method1
{ //Stuff }
- (void)method2
{ [self method1];}
我想通过创建别名[self method2];
来等同。[self method1];
这在Objective-C中可能吗?
我有一个相当简单的问题,我似乎找不到明确的答案。
有没有一种方法可以在不执行以下操作的情况下为方法创建别名:
- (void)method1
{ //Stuff }
- (void)method2
{ [self method1];}
我想通过创建别名[self method2];
来等同。[self method1];
这在Objective-C中可能吗?
如果您正在寻找一种无需编写太多代码的方式来做到这一点,那么您就不走运了。根据经验,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
如果您可以使用动态解决方案,则可以为此使用 objc 运行时。class_addMethod
是一个可以为您执行此操作的 API。
class_addMethod
不会替换,但其他 API 可以 - 注意不要替换现有的实现。选择器名称的好前缀是个好主意,这样可以避免冲突。