使用函數(shù)指針?lè)绞?/h2>
SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
當(dāng)有額外參數(shù)時(shí)结蟋,如
SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);
- 使用宏忽略警告
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[someController performSelector: NSSelectorFromString(@"someMethod")]
#pragma clang diagnostic pop
SEL selector = NSSelectorFromString(@"someMethod");
IMP imp = [_controller methodForSelector:selector];
void (*func)(id, SEL) = (void *)imp;
func(_controller, selector);
當(dāng)有額外參數(shù)時(shí)结蟋,如
SEL selector = NSSelectorFromString(@"processRegion:ofView:");
IMP imp = [_controller methodForSelector:selector];
CGRect (*func)(id, SEL, CGRect, UIView *) = (void *)imp;
CGRect result = func(_controller, selector, someRect, someView);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[someController performSelector: NSSelectorFromString(@"someMethod")]
#pragma clang diagnostic pop
通過(guò)使用#pragma clang diagnostic push/pop 你可以告訴Clang編譯器僅僅為某一特定部分的代碼來(lái)忽視特定警告.如果需要忽視的警告有多處衬衬,可以定義一個(gè)宏
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff;\
_Pragma("clang diagnostic pop") \
} while (0)
- 實(shí)際應(yīng)用中使用的宏定義
#define SafePerformSelector(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
在產(chǎn)生警告也就是performSelector的地方用使用該宏乾蛤,如
SuppressPerformSelectorLeakWarning([_target performSelector:_action withObject:self]);
如果需要performSelector返回值的話,
id result; SuppressPerformSelectorLeakWarning(result = [_target performSelector:_action withObject:self]);
- 使用afterDelay
[self performSelector:aSelector withObject:nil afterDelay:0.0];
如果在接受范圍內(nèi),允許在下一個(gè)runloop執(zhí)行,可以這么做配乓。xCode5沒(méi)問(wèn)題,但xCode6以后的話這個(gè)不能消除警告惠毁。