[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 歡迎大家的閱讀和讚揚、謝謝!

相關文章
相關標籤/搜索