美文网首页
004-runtime动态添加属性

004-runtime动态添加属性

作者: 紫荆秋雪_文 | 来源:发表于2017-02-25 20:15 被阅读11次

    1、使用场景

    • 使用runtime动态添加属性,目的就上让某个属性与对象产生关联
    • 需求:让NSObject类,保存一个‘字符串’

    2、解决方法一

    • 给系统类定义一个分类(NSObject),并且定义一个属性。然后实现该属性的set方法和getter方法,通过定义一个全局变量来记录这个属性的值
    //
    //  NSObject+objcet.h
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface NSObject (objcet)
    //property:只负责声明 set方法、getter方法,当是并不会实现set方法和getter方法�
    @property NSString *name;
    
    @end
    
    
    //
    //  NSObject+objcet.m
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "NSObject+objcet.h"
    
    //定义一个全局变量
    static NSString *_name;
    
    @implementation NSObject (objcet)
    
    - (void)setName:(NSString *)name {
        _name = name;
    }
    
    - (NSString *)name {
        return _name;
    }
    
    @end
    
    
    • 调用方法
    //
    //  ViewController.m
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "NSObject+objcet.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSObject *objc = [[NSObject alloc] init];
        objc.name = @"123";
        NSLog(@"%@", objc.name);
    }
    
    
    @end
    
    
    • 使用全局变量来记录属性值有一个缺点:有可能这个这个对象已经销毁了但是这个全局变量还存在

    3、使用runtime来动态给对象添加属性

    //
    //  NSObject+objcet.h
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface NSObject (objcet)
    //property:只负责声明 set方法、getter方法,当是并不会实现set方法和getter方法�
    @property NSString *name;
    
    @end
    
    
    //
    //  NSObject+objcet.m
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "NSObject+objcet.h"
    #import <objc/message.h>
    
    @implementation NSObject (objcet)
    
    - (void)setName:(NSString *)name {
        // object: 给那个对象添加属性
        // key: 属性名称
        // value: 属性值
        // policy: 保存策略
        objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSString *)name {
        return objc_getAssociatedObject(self, @"name");
    }
    
    @end
    
    
    • 调用方法
    //
    //  ViewController.m
    //  005-runtime(动态添加属性)
    //
    //  Created by 紫荆秋雪 on 2017/2/25.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "NSObject+objcet.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSObject *objc = [[NSObject alloc] init];
        objc.name = @"123";
        NSLog(@"%@", objc.name);
    }
    
    
    @end
    
    

    相关文章

      网友评论

          本文标题:004-runtime动态添加属性

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