运行时 - 这个“@@:”在class_addMethod中是什么意思?

时间:2017-04-19 09:44:06

标签: ios objective-c runtime

使用class_addMethod代码:

class_addMethod(newClass, @selector(inputAccessoryView), accessoryImp, "@@:");

参数“@@:”在这种方法中的含义是什么?

文档:

/** 
 * Adds a new method to a class with a given name and implementation.
 * 
 * @param cls The class to which to add a method.
 * @param name A selector that specifies the name of the method being added.
 * @param imp A function which is the implementation of the new method. The function must take at least two arguments—self and _cmd.
 * @param types An array of characters that describe the types of the arguments to the method. 
 * 
 * @return YES if the method was added successfully, otherwise NO 
 *  (for example, the class already contains a method implementation with that name).
 *
 * @note class_addMethod will add an override of a superclass's implementation, 
 *  but will not replace an existing implementation in this class. 
 *  To change an existing implementation, use method_setImplementation.
 */
OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp, 
                             const char *types) 
OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);

2 个答案:

答案 0 :(得分:2)

types参数描述了参数和返回类型 方法,如 class_addMethod

  

描述方法参数类型的字符数组。有关可能的值,请参阅Objective-C Runtime Programming Guide > Type Encodings。由于该函数必须至少包含两个参数 - self_cmd,因此第二个和第三个字符必须为“@:”(第一个字符是返回类型)。

"@@:"描述了一个返回对象的方法 (类型编码@,在您的情况下:UIView *)除了固定(隐藏)参数self(对象的类型编码@)和{{ 1}}(为选择器输入编码_cmd。)

答案 1 :(得分:0)

您知道Objective中的方法具有以下签名

(返回类型)(函数名)(id self,SEL cmd,...)

@@:平均 第一个字符代表返回类型。 @平均值对象类型(类类型) 第二个self参数 第三是SEL 该函数没有参数,因此以:

结尾

例如: “ v @:i @”

-(void)functionName:(int)arg arg2:(id)arg2;

平均值

  1. v:是带有void类型的返回类型 @:是自我和选择 我是一个整数参数 @是对象类型参数

您可以查看一下Apple文档,进一步了解。 file in official github repo