ios-runtime

iOS实现调用动态方法名有返回值的方法

2016-08-19  本文已影响1988人  冲上云霄90

使用函数指针方式

    SEL selector = NSSelectorFromString(@"someMethod");
    IMP imp = [_controller methodForSelector:selector];
    void (*func)(id, SEL) = (void *)imp;
    func(_controller, selector);
    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

通过使用#pragma clang diagnostic push/pop 你可以告诉Clang编译器仅仅为某一特定部分的代码来忽视特定警告.如果需要忽视的警告有多处,可以定义一个宏

#define SuppressPerformSelectorLeakWarning(Stuff) \
    do { \
        _Pragma("clang diagnostic push") \
        _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
    Stuff;\
    _Pragma("clang diagnostic pop") \
   } while (0)
#define SafePerformSelector(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)

在产生警告也就是performSelector的地方用使用该宏,如

SuppressPerformSelectorLeakWarning([_target performSelector:_action withObject:self]);

如果需要performSelector返回值的话,

 id result;    SuppressPerformSelectorLeakWarning(result = [_target performSelector:_action withObject:self]);
    [self performSelector:aSelector withObject:nil afterDelay:0.0];

如果在接受范围内,允许在下一个runloop执行,可以这么做。xCode5没问题,但xCode6以后的话这个不能消除警告。

上一篇 下一篇

猜你喜欢

热点阅读