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.给分类添加属性spa

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

 

```对象

 

@implementation ViewControllerblog

 

- (void)viewDidLoad {内存

    [super viewDidLoad];ci

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

    

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

    

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

    objc.name = @"小码哥";string

    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

相关文章
相关标签/搜索