• ios开发runtime学习四:动态添加属性


    #import "ViewController.h"
    #import "Person.h"
    #import "NSObject+Property.h"
    
    
    /**
     *    总结:1:动态添加属性:什么时候需要动态添加属性 开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方法 本质:动态添加属性,就是让某个属性与对象产生关联。runtime一般都是针对系统的类
             2:让一个NSObject类 保存一个字符串:可以为系统的类写一个分类,属性定义某个变量:在分类中属性定义某个变量,则只会对该变量生成set,get方法的声明,不会生成实现,需要自己去写实现方法,也不会生成带下划线的成员变量。若要是想让外界访问该成员变量,1:可以在分类中用static定义全局变量,在get方法的实现中返回该成员变量 弊端:当该类销毁的时候,该属性的成员变量也不会销毁 2:在分类中利用runtime动态添加属性
     */
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
       
        NSObject *objc = [[NSObject alloc] init];
        objc.name = @"123";
        NSLog(@"%@",objc.name);
        
        // 创建字符串对象
    //    NSString *str = [NSString stringWithString:@"123"];
    //    
    //    Person *p = [[Person alloc] init];
    //    
    //    p.name = str;
        
    }
    
    @end
    #import <Foundation/Foundation.h>
    
    @interface NSObject (Property)
    
    
    /**
     * 1:@property分类:只会生成get,set方法声明,不会生成实现,需要自己手动去生成实现方法,也不会生成下划线成员属性,可以用static定义下划线的成员变量在手动实现的get方法中返回,也可以用runtime实现动态添加属性
       2:因为在分类中定义的属性不会生成下划线的成员变量,所以可以省略不写策略方式,只写定义就可以了@property NSString *name;
     */
    @property NSString *name;
    
    @end
    #import "NSObject+Property.h"
    #import <objc/message.h>
    /**
     *    1:runtime动态添加属性: 1:为系统的类写分类,并属性定义变量,可以不写策略,并手动实现set和get方法
        2:在set方法中可以利用runtime实现动态添加属性
        objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        object:给哪个对象添加属性
        key:属性名称
        value:属性值
        policy:保存策略
     
        2:在set方法中可以将该值取出来:objc_getAssociatedObject(self, @"name");
    
     */
    @implementation NSObject (Property)
    
    //static NSString *_name;
    
    - (void)setName:(NSString *)name
    {
        // 让这个字符串与当前对象产生联系
        
    //    _name = name;
        // object:给哪个对象添加属性
        // key:属性名称
        // value:属性值
        // policy:保存策略
        objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSString *)name
    {
        return objc_getAssociatedObject(self, @"name");
    }
    
    @end

    ####4.给分类添加属性

    * 原理:给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。

    ```

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        // Do any additional setup after loading the view, typically from a nib.

        

        // 给系统NSObject类动态添加属性name

        

        NSObject *objc = [[NSObject alloc] init];

        objc.name = @"小码哥";

        NSLog(@"%@",objc.name);

        

    }

    @end

    // 定义关联的key

    static const char *key = "name";

    @implementation NSObject (Property)

    - (NSString *)name

    {

        // 根据关联的key,获取关联的值。

        return objc_getAssociatedObject(self, key);

    }

    - (void)setName:(NSString *)name

    {

        // 第一个参数:给哪个对象添加关联

        // 第二个参数:关联的key,通过这个key获取

        // 第三个参数:关联的value

        // 第四个参数:关联的策略

        objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    }

    @end

  • 相关阅读:
    004: 基本数据类型-List
    003: 基本类型-字符串类型
    002: 基本类型-数值型(int, float)
    001: Hello World
    Python中的单例模式的几种实现方式的及优化
    django之admin组件
    权限管理---设计分析以及具体细节
    基于Form组件实现的增删改和基于ModelForm实现的增删改
    Python常见问题系列
    django的render的说明
  • 原文地址:https://www.cnblogs.com/cqb-learner/p/5871917.html
Copyright © 2020-2023  润新知