zoukankan      html  css  js  c++  java
  • iOS动态运行时方法

    在某些时候,程序可能需要根据获取的参数来决定调用的方法。

    要实现这样的功能,就需要使用到动态运行时方法了。

    首先需要定义好接口,以便调用。

    然后就是动态调用定义好的方法。

    这里有两种方法,

    第一种:

    // 有参数则需要加上冒号
    SEL sel = NSSelectorFromString(@"save:");
    
    MyObject obj = [MyObject new];
    
    [obj performSelector:sel withObject:@{@"1":@"one"}];

    使用第一种方法,程序会出现警告。

    第二种:(使用方法指针调用)

    MyObject obj = [MyObject new];
    
    SEL sel = NSSelectorFromString(@"save:");
    
    IMP imp = [obj methodForSelector:sel];
    
    /*
     * id 对象
     * SEL 对象的方法
     * id 方法的参数
     */    
    void (*func)(id, SEL, id) = (void *)imp;

    // 或者可以这样写

    // ((void (*)(id, SEL, id))[obj methodForSlector:sel])(obj, sel, @{@"1":@"one"}); func(manager, sel, @{
    @"1":@"one"});

    另外,id类型的熟练使用非常重要。

    NSString *param = @"{"mm":"iosqiao","yhm":"123456"}";
      id obj = [NSJSONSerialization
          JSONObjectWithData:[param dataUsingEncoding:NSUTF8StringEncoding]
                     options:0
                       error:nil];
      MyObject *manager = [MyObject new];
      if (!manager) {
        return;
      }
      SEL sel = NSSelectorFromString(@"saveStorage:");
      IMP imp = [manager methodForSelector:sel];
      void (*func)(id, SEL, id) = (void *)imp;
      func(manager, sel, obj);
  • 相关阅读:
    03-TypeScript中的强类型
    02-TypeScript中新的字符串
    01-TypeScript概述
    2.WF 4.5 流程引擎设计思路
    1.WF 4.5在项目中直接使用的问题
    领域驱动设计-划分界限上下文
    领域驱动设计-软件挑战与应对
    领域驱动设计-基本概念
    领域驱动设计-序言
    从程序员的防猝死,思考码农身后的家庭保障
  • 原文地址:https://www.cnblogs.com/hd1992/p/5648800.html
Copyright © 2011-2022 走看看