performSelector (選擇器枪萄,用于消息傳遞)
前段時間在使用performSelector時出現(xiàn)了以下警告:performSelector may cause a leak because its selector is unknown硬爆,于是上網(wǎng)搜了一下資料癌瘾,了解了一下performSelector這個東西以清。
先來看看關(guān)于performSelector的調(diào)用方法:
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
以上三個方法只有參數(shù)不同宣蔚,但最多只支持兩個參數(shù)傳遞弄企,當(dāng)然多余的參數(shù)可以放到字典戏挡、數(shù)組里货徙,這個不存在問題左权。
當(dāng)調(diào)用我[target performSelector:action withObject:selfwithObject:arr];時,出現(xiàn)警告:performSelector may cause a leak because its selector is unknown痴颊,原因是arc下在編譯期只確定消息名和參數(shù)數(shù)目,并不確定方法的地址赏迟,也不知道方法會返回什么,所以會出現(xiàn)警告蠢棱。
解決辦法:
1.宏定義忽略警告
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
調(diào)用
SuppressPerformSelectorLeakWarning(
[target performSelector:action withObject:selfwithObject:arr];
);
當(dāng)然這只能忽略而已
2.延時調(diào)用锌杀,但是多線程中想過去maybe會出問題,沒測過
[targetperformSelector:actionwithObject:selfafterDelay:1];
3.函數(shù)指針調(diào)用,符合oc底層調(diào)用
(stackoverflow:http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown)
SELselector =NSSelectorFromString(@"someMethod");
((void(*)(id,SEL))[targetmethodForSelector:selector])(target, selector);
例如:((void(*)(id,SEL))[currentTargetmethodForSelector:currentAction])(message,currentAction);