美文网首页
给系统的类动态添加属性

给系统的类动态添加属性

作者: Z了个L | 来源:发表于2016-12-11 15:12 被阅读21次
    
    // NSObject分类
    // NSObject.h
    #import <Foundation/Foundation.h>
    
    @interface NSObject (Property)
    
    // @property在分类中作用:仅仅是生成get,set方法声明,不会生成get,set方法实现和下划线成员属性
    /** 姓名 */
    @property (nonatomic, strong) NSString *name;
    
    @end
    
    // NSObject.m
    #import "NSObject+Property.h"
    #import <objc/message.h>
    
    @implementation NSObject (Property)
    
    // 只要想调用runtime方法,思考:谁的事情
    - (void)setName:(NSString *)name {
        // 动态添加属性 = 本质:让对象的某个属性与值产生关联
        /*
         object:保存到哪个对象中
         key:用什么属性保存 属性名,这个可以随便写
         value:保存值
         policy:策略,strong,weak
         */
        objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (NSString *)name {
        return objc_getAssociatedObject(self, @"name");
    }
    
    @end
    
    
    
    // ViewController.h
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    
    @end
    
    // ViewController.m
    #import "ViewController.h"
    #import "NSObject+Property.h"
    
    /*
        runtime:不要随便去用
        需求:给NSObject添加一个name属性,动态添加属性 -> runtime
        属性的本质:让属性与某个对象产生一段关联
        使用场景:给系统的类添加属性
     */
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        NSObject *objc = [[NSObject alloc] init];
        objc.name = @"123";
        NSLog(@"==%@", objc.name);
    }
    
    
    @end
    
    // 可以用黑魔法用自己写的方法和系统的方法交换,但是注意了,不要随便乱用,万一出了什么莫名其妙的Bug,也许就是你乱用黑魔法造成的。原因可能比较难找。
    
    

    相关文章

      网友评论

          本文标题:给系统的类动态添加属性

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