美文网首页ios-runtime
iOS实现调用动态方法名有返回值的方法

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

作者: 冲上云霄90 | 来源:发表于2016-08-19 11:25 被阅读1988次

使用函数指针方式

    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]);
  • 使用afterDelay
    [self performSelector:aSelector withObject:nil afterDelay:0.0];

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

相关文章

  • iOS动态调用类方法

    iOS动态调用类方法(不带参数) iOS动态调用类方法(带参数) iOS动态调用类方法(有返回值) 优点 弱化连接...

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

    使用函数指针方式 当有额外参数时,如 使用宏忽略警告 通过使用#pragma clang diagnostic p...

  • AppleScript-方法

    定义方法 on 方法名(参数列表)return 返回值 -- 如果无返回值可不写end 方法名 方法的调用可在定义...

  • 反射+动态代理

    反射+动态代理反射:以类名得到该类的属性名,属性值,方法名,方法的默认返回值,然后调用set/invoke等方法来...

  • Java基础知识4—方法与数组

    一.方法 1.方法的定义与调用 1)定义 : 修饰符 返回值类型 方法名(参数列表){ //方法体 } ①返回值类...

  • OC(二)字符串、方法

    /*有返回值的方法(给别人一个数据)//有参数函数跟别人要一个数据 公式: - (返回值类型)方法名; 实现: -...

  • OC琐碎点汇总(一)

    - (void)方法名:(参数类型)参数名 方法名:(参数类型)参数名 { 具体实现代码 } *方法的调用 [对象...

  • NSInvocation的使用

    版本:iOS13.6 一、简介 通常调用方法的方式是使用[实例 方法名]或[实例 方法名:参数] 若该方法没有公开...

  • IOS-中的方法

    在 IOS 中方法名都特别长,但是易读 接下来我们来自定义方法名 一个参数 两个参数 void 代表没有返回值,有...

  • IOS中的方法

    在 IOS 中方法名都特别长,但是易读 接下来我们来自定义方法名 一个参数 两个参数 void 代表没有返回值,有...

网友评论

    本文标题:iOS实现调用动态方法名有返回值的方法

    本文链接:https://www.haomeiwen.com/subject/swijjttx.html