我有一个相当简单的问题,我似乎无法找到明确的答案。
有没有办法为方法创建一个别名,而不用做这样的事情:
- (void)method1
{ //Stuff }
- (void)method2
{ [self method1];}
我希望[self method2];
通过创建别名来等同于[self method1];
。这在Objective-C中是否可行?
答案 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可以 - 小心不要替换现有的实现。选择器名称的良好前缀是个好主意,这样您就可以避免碰撞。