forked from Tencent/QMUI_iOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
NSObject+QMUI.h
140 lines (113 loc) · 5.66 KB
/
NSObject+QMUI.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//
// NSObject+QMUI.h
// qmui
//
// Created by MoLice on 2016/11/1.
// Copyright © 2016年 QMUI Team. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (QMUI)
/**
判断当前类是否有重写某个父类的指定方法
@param selector 要判断的方法
@param superclass 要比较的父类,必须是当前类的某个 superclass
@return YES 表示子类有重写了父类方法,NO 表示没有重写(异常情况也返回 NO,例如当前类与指定的类并非父子关系、父类本身也无法响应指定的方法)
*/
- (BOOL)qmui_hasOverrideMethod:(SEL)selector ofSuperclass:(Class)superclass;
/**
判断指定的类是否有重写某个父类的指定方法
@param selector 要判断的方法
@param superclass 要比较的父类,必须是当前类的某个 superclass
@return YES 表示子类有重写了父类方法,NO 表示没有重写(异常情况也返回 NO,例如当前类与指定的类并非父子关系、父类本身也无法响应指定的方法)
*/
+ (BOOL)qmui_hasOverrideMethod:(SEL)selector forClass:(Class)aClass ofSuperclass:(Class)superclass;
/**
对 super 发送消息
@param aSelector 要发送的消息
@return 消息执行后的结果
@link http://stackoverflow.com/questions/14635024/using-objc-msgsendsuper-to-invoke-a-class-method @/link
*/
- (id)qmui_performSelectorToSuperclass:(SEL)aSelector;
/**
对 super 发送消息
@param aSelector 要发送的消息
@param object 作为参数传过去
@return 消息执行后的结果
@link http://stackoverflow.com/questions/14635024/using-objc-msgsendsuper-to-invoke-a-class-method @/link
*/
- (id)qmui_performSelectorToSuperclass:(SEL)aSelector withObject:(id)object;
/**
* 系统的 performSelector 不支持参数或返回值为非对象的 selector 的调用,所以在 QMUI 增加了对应的方法,支持对象和非对象的 selector。
* 这个方法用于无参数无返回值的 selector 调用。
* @param selector 要被调用的方法名
*/
- (void)qmui_performSelector:(SEL)selector;
/**
* 系统的 performSelector 不支持参数或返回值为非对象的 selector 的调用,所以在 QMUI 增加了对应的方法,支持对象和非对象的 selector。
* @param selector 要被调用的方法名
* @param returnValue selector 的返回值的指针地址
*/
- (void)qmui_performSelector:(SEL)selector withReturnValue:(void *)returnValue;
/**
* 系统的 performSelector 不支持参数或返回值为非对象的 selector 的调用,所以在 QMUI 增加了对应的方法,支持对象和非对象的 selector。
* @param selector 要被调用的方法名
* @param firstArgument 调用 selector 时要传的第一个参数的指针地址
*/
- (void)qmui_performSelector:(SEL)selector withArguments:(void *)firstArgument, ...;
/**
* 系统的 performSelector 不支持参数或返回值为非对象的 selector 的调用,所以在 QMUI 增加了对应的方法,支持对象和非对象的 selector。
*
* 使用示例:
* CGFloat result;
* CGFloat arg1, arg2;
* [self qmui_performSelector:xxx withReturnValue:&result arguments:&arg1, &arg2, nil];
* // 到这里 result 已经被赋值为 selector 的 return 值
*
* @param selector 要被调用的方法名
* @param returnValue selector 的返回值的指针地址
* @param firstArgument 调用 selector 时要传的第一个参数的指针地址
*/
- (void)qmui_performSelector:(SEL)selector withReturnValue:(void *)returnValue arguments:(void *)firstArgument, ...;
/**
使用 block 遍历指定 class 的所有成员变量(也即 _xxx 那种),不包含 property 对应的 _property 成员变量,也不包含 superclasses 里定义的变量
@param block 用于遍历的 block
*/
- (void)qmui_enumrateIvarsUsingBlock:(void (^)(Ivar ivar, NSString *ivarName))block;
/**
使用 block 遍历指定 class 的所有成员变量(也即 _xxx 那种),不包含 property 对应的 _property 成员变量
@param aClass 指定的 class
@param includingInherited 是否要包含由继承链带过来的 ivars
@param block 用于遍历的 block
*/
+ (void)qmui_enumrateIvarsOfClass:(Class)aClass includingInherited:(BOOL)includingInherited usingBlock:(void (^)(Ivar ivar, NSString *ivarName))block;
/**
使用 block 遍历指定 class 的所有属性,不包含 superclasses 里定义的 property
@param block 用于遍历的 block
*/
- (void)qmui_enumratePropertiesUsingBlock:(void (^)(objc_property_t property, NSString *propertyName))block;
/**
使用 block 遍历指定 class 的所有属性
@param aClass 指定的 class
@param includingInherited 是否要包含由继承链带过来的 property
@param block 用于遍历的 block
*/
+ (void)qmui_enumratePropertiesOfClass:(Class)aClass includingInherited:(BOOL)includingInherited usingBlock:(void (^)(objc_property_t property, NSString *propertyName))block;
/**
使用 block 遍历当前实例的所有方法,不包含 superclasses 里定义的 method
*/
- (void)qmui_enumrateInstanceMethodsUsingBlock:(void (^)(Method method, SEL selector))block;
/**
使用 block 遍历指定的某个类的实例方法
@param aClass 指定的 class
@param includingInherited 是否要包含由继承链带过来的 method
@param block 用于遍历的 block
*/
+ (void)qmui_enumrateInstanceMethodsOfClass:(Class)aClass includingInherited:(BOOL)includingInherited usingBlock:(void (^)(Method method, SEL selector))block;
/**
遍历某个 protocol 里的所有方法
@param protocol 要遍历的 protocol,例如 \@protocol(xxx)
@param block 遍历过程中调用的 block
*/
+ (void)qmui_enumerateProtocolMethods:(Protocol *)protocol usingBlock:(void (^)(SEL selector))block;
@end