• iOS runtime 运行时( 三 )




    上一篇 聊的是: 在不知道一个对象有什么属性的情况下, 获取对象的所有属性,然后可以改变属性的值, 今天我们谈谈 怎么通过Category(类别)+runtime 给一个类 添加一个新的属性,一般情况下,我们通常背的概念都是,Category(类别)只可以添加方法,不可以添加属性,但是有了runTime之后,一切就不一样了 上代码喽·····

    引入

    #import <objc/runtime.h>


    添加
    static void* FYObjProKey = @"FYObjProKey";

    1  NSObject *object = [[NSObject alloc] init];
    2  NSString *str = @"runTime添加的变量";
    3     // 添加 属性
    4  objc_setAssociatedObject(object, &FYObjProKey, str, OBJC_ASSOCIATION_COPY);
    5     // 获取 属性
    6  id objValue =  objc_getAssociatedObject(object, &FYObjProKey);
    7 
    8  NSString *getStr = (NSString *)objValue;
    9  NSLog(@"%@",getStr);
    View Code

    系统类 NSObject,通过 objc_getAssociatedObject 这个方法,绑定了一个新的变量,通过objc_getAssociatedObject 这个方法得到 新绑定的变量,稍后再细讲这两个方法,核心就是绑定了一个变量,通过这个模式我们来把我们一开始的目的实现
    下面我们 新建一个NSObject的类别

     1 #import <Foundation/Foundation.h>
     2 @interface NSObject (FYAddtions)
     3 @property(nonatomic,copy)NSString *hotelName;
     4 @end
     5 
     6 #import "NSObject+FYAddtions.h"
     7 #import <objc/runtime.h>
     8 static void* FYObjProKey = @"FYObjProKey";
     9 @implementation NSObject (FYAddtions)
    10 
    11 -(void)setHotelName:(NSString *)hotelName
    12 {
    13     objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
    14 }
    15 
    16 -(NSString *)hotelName
    17 {
    18     return objc_getAssociatedObject(self, &FYObjProKey);
    19 }
    20 @end
    View Code

    由于系统类,是不可变的,通过这个方法,就可以变相的给NSObject 添加了一个属性
    下面我们来尝试一下:
    在新的类里,引入头文件

    import "NSObject+FYAddtions.h"

    1 NSObject *object = [[NSObject alloc] init];
    2 object.hotelName = @"哈哈哈";
    3 NSLog(@"%@",object.hotelName);
    View Code

    这样 我们就通过 Category(类别)+runtime 给一个类 添加一个新的属性,感觉 怎么样,有的人是不是 感觉在项目里不知道怎么用呢,是的,这种变态的写法,只有 很变态的需求才会让广大程序员(媛)不得不翻资料,使用这样的方法,下面给大家 发两个 类别,一行代码 搞定 UIAlertView UIActionSheet,不用再写代理去区分很多个弹出框了,就使用了这样的方法达到了 消除代理的 目的
    点击去下载

    好了目的实现了,下面说说 这两个方法

     1 1.objc_setAssociatedObject(self, &FYObjProKey, hotelName, OBJC_ASSOCIATION_COPY);
     2 self 是要给哪个对象添加 变量
     3 &FYObjProKey 是对这个变量的标记,获得这个变量也是需要这个key值得
     4 hotelName 是 这个 变量的值
     5 OBJC_ASSOCIATION_COPY 这个 是添加变量的策略,和属性的copy类似 
     6 一共有 5 个策略
     7 OBJC_ASSOCIATION_ASSIGN;            //assign策略
     8 OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy,nonatomic策略
     9 OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain,nonatomic策略
    10 OBJC_ASSOCIATION_RETAIN //retain策略
    11 OBJC_ASSOCIATION_COPY  //copy策略
    View Code
    1 2.objc_getAssociatedObject(self, &FYObjProKey)
    2  通过 &FYObjProKey 这个标记 获得 新添加的变量
    View Code
  • 相关阅读:
    4.状态简览
    3.获取git仓库
    2.获取帮助
    1.初次运行git前的配置
    linux命令总结
    使用github参与到开源项目的维护
    mongodb远程连接
    springmvc/springboot处理前台字符串日期自动转换成后台date类型的三种办法
    事务明明配置没有问题,出错时却不执行回滚
    tmux 安装
  • 原文地址:https://www.cnblogs.com/fengmin/p/5319103.html
Copyright © 2020-2023  润新知