美文网首页
runtime(二)--使用runtime给分类添加属性

runtime(二)--使用runtime给分类添加属性

作者: 小歪子go | 来源:发表于2017-12-17 17:08 被阅读0次

    记得刚做开发的时候,给分类添加属性,使用的时候老是造成奔溃,后来才发现在分类中属性定义某个变量,则只会对该变量生成set,get方法的声明,不会生成实现,需要自己去写实现方法,也不会生成带下划线的成员变量。若要是想让外界访问该成员变量,1:可以在分类中用static定义全局变量,在get方法的实现中返回该成员变量 弊端:当该类销毁的时候,该属性的成员变量也不会销毁 2:在分类中利用runtime动态添加属性
    */

    使用runtime给分类添加属性

    #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
    
    #import "ViewController.h"
    #import "Person.h"
    #import "NSObject+Property.h"
    
    
    
    
    @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
    

    相关文章

      网友评论

          本文标题:runtime(二)--使用runtime给分类添加属性

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