[Runtime]-动态添加属性

>1:动态添加属性?测试

给系统的类添加属性的时候,能够使用runtime的动态添加属性方法spa

>2:如需求:让一个NSObject类 保存一个字符串?code

首先:咱们想要给系统的类进行拓展功能或者添加属性是拿不到系统的类的,因此只能经过建立一个对应分类就能够了对象

1:建立一个NSObject+Property的分类:ci

// 最佳方式:使用runtime动态添加属性,对象消失该属性也就不在了字符串

#import <Foundation/Foundation.h>

@interface NSObject (Property)

// @property在分类中的做用:只会生成get、set方法的声明,不会生成实现,也不会生成下划线的成员属性
@property NSString *name;

@end


#import "NSObject+Property.h"
#import <objc/message.h>

//static NSString *_name;

@implementation NSObject (Property)

- (void)setName:(NSString *)name {
    
    // 让这个字符串与当前的对象产生联系:它生就生、它死就死
    //_name = name;
    
    // 1参数:给哪一个对象添加属性
    // 2参数:属性名称
    // 3参数:属性值
    // 4参数:保存策略
    objc_setAssociatedObject(self,@"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    
}

-(NSString *)name {
    
    return objc_getAssociatedObject(self, @"name");
    //return _name;
}

@end

 

// 不佳方式:使用一个静态变量保存属性,而后实现分类中属性的set、get方法:它不能作到:get

《让这个字符串与当前的对象产生联系:它生就生、它死就死》it

#import <Foundation/Foundation.h>

@interface NSObject (Property)

// @property在分类中的做用:只会生成get、set方法的声明,不会生成实现,也不会生成下划线的成员属性
@property NSString *name;

@end



#import "NSObject+Property.h"
#import <objc/message.h>

static NSString *_name;

@implementation NSObject (Property)

- (void)setName:(NSString *)name {
    
    _name = name;
}

-(NSString *)name {
    
    return _name;
}

@end

 

使用-测试:io

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSObject *obj = [[NSObject alloc]init];
    obj.name = @"123";
    NSLog(@"obj.name====%@",obj.name);
    
}

 

 

>3:总结:class

/**
 动态添加属性:何时须要动态添加属性--给系统的类添加属性的时候,能够使用runtime动态添加属性方法
 *  1: 需求:让一个NSObject类,保存一个字符串
 *  2: runtime:通常都是针对系统的类进行处理
 *  3: 本质:动态添加属性,就是让这个属性与某个对象产生关联
 */

 

意见反馈邮件:1415429879@qq.com 欢迎大家的阅读和赞扬、谢谢!

相关文章
相关标签/搜索