Runtime实战之导航控制器那些事

作者:计算机知识

在捣鼓导航效率的时候开采了比超级多遗闻物,最终还用到了Runtime,在那处和贵胄享受一下自家捣鼓导航成效的片段经验吧。

为了学习Runtime,大家应当必要从多少个地点开头:

Runtime实战之导航控制器那些事。实战一: 数据转模型

对象: 数据转模型
考验知识点: 获取属性列表, 关联属性, 辞典转模型

  • 1, 获取类的属性列表(class_copyPropertyList)
  • 2, 数据转模型(setValueForKey卡塔尔(قطر‎
  • 3, 优化(通过涉及属性的不二等秘书诀卡塔尔国

1.获取类的习性的列表

 // 调用运行时方法,取得类的属性列表
    // Ivar 成员变量
    // Method 方法
    // Property 属性
    // Protocol 协议
    /**
     参数
     1. 要获取的类
     2. 类属性的个数指针

     返回值
     所有属性的`数组`,C 语言中,数组的名字,就是指向第一个元素的地址

     retain/create/copy 需要 release,最好 option   click
     */
  (NSArray *)cz_objProperties {


    unsigned int count = 0;
    objc_property_t *proList = class_copyPropertyList([self class], &count);

    NSLog(@"属性的数量 %d", count);
    // 创建数组
    NSMutableArray *arrayM = [NSMutableArray array];

    // 遍历所有的属性
    for (unsigned int i = 0; i < count; i  ) {

        objc_property_t pty = proList[i];

        // 2. 从 pty 中获得属性的名称
        const char *cName = property_getName(pty);

        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];

        // 3. 属性名称添加到数组
        [arrayM addObject:name];
    }

    // 释放数组  一定不要忘记
    free(proList);
    return arrayM.copy;
}

2. 数据转模型

// 所有字典转模型框架,核心算法!
  (instancetype)cz_objWithDict:(NSDictionary *)dict {
    // 实例化对象
    id object = [[self alloc] init];

    // 使用字典,设置对象信息
    // 1> 获得 self 的属性列表
    NSArray *proList = [self cz_objProperties];

    // 2> 遍历字典
    [dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

        NSLog(@"key %@ --- value %@", key, obj);
        // 3> 判断 key 是否在 proList 中
        if ([proList containsObject:key]) {
            //  说明属性存在,可以使用 `KVC` 设置数值
            [object setValue:obj forKey:key];
        }
    }];

    return object;
}

由此地点两步 大家得以兑现了多少转模型, 不过当大家要扩充优化, 在数据转模型的时候,是以递归调用的格局 实现转变. 全部大家要对他张开优化, 当同二个类进行数据转模型的时候, 假设在再次转 大家实现不另行获取类的属性
3. 优化(关联对象卡塔尔

  (NSArray *)cz_objProperties {

    // --- 1. 从`关联对象`中获取对象属性,如果有,直接返回!
    /**
     获取关联对象 - 动态添加的属性

     参数:
     1. 对象 self
     2. 动态属性的 key

     返回值
     动态添加的`属性值`
     */
    NSArray *ptyList = objc_getAssociatedObject(self, kPropertiesListKey);
    if (ptyList != nil) {
        return ptyList;
    }

    // 调用运行时方法,取得类的属性列表
    // Ivar 成员变量
    // Method 方法
    // Property 属性
    // Protocol 协议
    /**
     参数
     1. 要获取的类
     2. 类属性的个数指针

     返回值
     所有属性的`数组`,C 语言中,数组的名字,就是指向第一个元素的地址

     retain/create/copy 需要 release,最好 option   click
     */
    unsigned int count = 0;
    objc_property_t *proList = class_copyPropertyList([self class], &count);

    NSLog(@"属性的数量 %d", count);
    // 创建数组
    NSMutableArray *arrayM = [NSMutableArray array];

    // 遍历所有的属性
    for (unsigned int i = 0; i < count; i  ) {

        // 1. 从数组中取得属性
        /**
         C 语言的结构体指针,通常不需要 `*`
         */
        objc_property_t pty = proList[i];

        // 2. 从 pty 中获得属性的名称
        const char *cName = property_getName(pty);

        NSString *name = [NSString stringWithCString:cName encoding:NSUTF8StringEncoding];

//        NSLog(@"%@", name);
        // 3. 属性名称添加到数组
        [arrayM addObject:name];
    }

    // 释放数组
    free(proList);

    // --- 2. 到此为止,对象的属性数组已经获取完毕,利用关联对象,动态添加属性
    /**
     参数

     1. 对象 self [OC 中 class 也是一个特殊的对象]
     2. 动态添加属性的 key,获取值的时候使用
     3. 动态添加的属性值
     4. 对象的引用关系
     */
    objc_setAssociatedObject(self, kPropertiesListKey, arrayM.copy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    return arrayM.copy;
}

Runtime简单称谓运维时,正是iOS系统在运作的时候的一种机制,当中最要害的是音讯机制,是一套底层的纯C语言的API。

事实上,日常大家编辑的OC代码,底层都以基于Runtime落成,最终转成了尾部的Runtime代码(C语言代码)。

在运用天猫商城,和讯快讯那么些APP的时候,开掘她们在push的时候。不是系统的功用。系统的作用是上面这种:

  1. 是什么?
  2. 何以会现出?
  3. 怎么做?
  4. 分享
  5. 能干嘛?

那篇作品主要写自身读书Runtime此中一种采用,给Category动态增进实例变量。

图片 1可是天猫商铺依旧天涯论坛新闻的作用是底下这种:图片 2你注意到了吧?Apple自带的是回到上一页的手势必需临近页面包车型大巴左侧的边缘,而在想天猫或许博客园快讯那样的回来手势不用挨近边缘也是能够的。系统是从未提供格局给我们平素改造边缘手势的法子。系统的那个手势叫interactivePopGestureRecognizer,在UINavigationController中对此他的定义是readonly,因而我们唯有想别的方式达成全屏手势的功效。

是何等? 为啥会并发?

C语言是静态语言,决定阶段是在编写翻译期,而笔者辈庞大的Apple工程师(其实Objective-C不是Apple发明的,这里临时这么算呢)把Objective-C定义为了动态语言。那要让Objectiive-C具备动态语言的风味,就非得有三个东西承载这种特点,而这种天性就是Runtime。个人理解,如有偏颇见谅!``具体其他定义可Google搜索,会看到有很多资料,不多说了。

越来越尖锐领会其规律,研商底层实现,提议看看雷纯锋的Objective-C Associated Objects 的落成原理。

本文由bwin必赢发布,转载请注明来源

关键词: 实战 控制器 Runtime 个人感悟