Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C方法名称别名_Ios_Objective C - Fatal编程技术网

Ios Objective-C方法名称别名

Ios Objective-C方法名称别名,ios,objective-c,Ios,Objective C,我有一个相当简单的问题,我似乎找不到确切的答案 有没有一种方法可以在不执行类似操作的情况下为方法生成别名 - (void)method1 { //Stuff } - (void)method2 { [self method1];} 我想要[self method2]等同于[self method1]通过创建别名。这在Objective-C中可能吗?如果您正在寻找一种不用编写太多代码就可以实现这一点的方法,那么您就倒霉了。根据经验,Obj-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];
}

包含更多详细信息的官方文档可在此处找到:

如果您可以使用动态解决方案,则可以使用objc运行时来实现此目的
class_addMethod
是一个可以为您实现这一点的API


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

我不知道在Objective-C中实现这一点的方法。您希望通过这种行为获得什么?这看起来很像X-Y问题。您能否描述一下您希望通过避免创建执行转发的新方法来解决的核心问题?您可以定义method2 method1
并让预处理器处理它。请非常小心预处理器宏,因为它是纯文本替换,几乎没有上下文意识。所有对
method2
名称的引用作为标记将被替换为
method1
的名称,无论是否与类一起使用,作为消息选择器,并且可能会产生意想不到的副作用。@David这听起来像是糟糕的设计;如果您拥有这两个类的实现,并且它们的工作方式非常相似,您希望对这些方法进行别名,那么请重命名这些方法并使用它们。如果类来自库,那么考虑创建一个包装器对象,它根据需要规范行为。你能给出一些Objy-C框架类使用它的例子吗?或者可以潜在地使用这一点?@史葛,框架不在最神秘的情况下使用这个机制。要避免这种模式,因为它们很脆弱、容易混淆,并且表明底层设计有缺陷,应该重新审视。@bbum我想这就是类集群的典型实现方式?它们的不同之处是什么?类群集在
init
期间创建不同类的新实例,没有消息转发。@AbhiBeckert
NSManagedObject
不使用转发;它为建模的属性动态创建方法实现。它是一个非常具体的用例和解决方案,不能很好地映射到通用用途。