使用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);
答案 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;
平均值
您可以查看一下Apple文档,进一步了解。 file in official github repo