NSInvocation
NSInvocation本质就是将一个方法转发成一个对象。NSInvocation中的selector 直接关联着一个方法
@interface NSInvocation:NSObject
通过方法签名获得NSInvocation对象
-
(NSInvocation)invocationWithMethodSignation:(NSMethodSignature)sig;
readonly的方法签名对象。只可以在实例化对象的时候传入,之后只能读取不可以修改
@property (readonly, retain) NSMethodSignature *methodSignature;
//可以设置的调用对象
@property(nullable,assign) id target;// 调用方法
@property SEL selector;
//调用
-(void)invoke;
//让某个对象去相应
-(void)invokeWithTarget:(id)target;
NSMethodSignature(方法签名)
主要方法是 (nullable NSMethodSignature *)signatureWithObjCTypes:(const char *)types;
通过一个Type Encoding 来实例化一个方法签名的实例对象。
Type Encoding一般格式为"v@:","v@:@","v@:i"等。不同的字符代表不同的值
runtime的一些APi
Class object_getClass
struct objc_method_description protocol_getMethodDescription(Protocol * _Nonnull proto, SEL _Nonnull aSel, BOOL isRequiredMethod, BOOL isInstanceMethod)
获取协议中某个方法的声明。获得是一个结构体对象。 objc_method_description 中包含一个SEL对象,和一个const char* type对象protocol_isEqual(Protocol * _Nullable proto, Protocol * _Nullable other) 比较两个协议是否相同
sel_isEqual(SEL _Nonnull lhs, SEL _Nonnull rhs)
比较2个Selector是否相同obj_getProtcol(const char*) 通过一个字符串得到一个Protocol
得到一个类实例的父类 class_getSuperClass(Class class);