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

相關文章
相關標籤/搜索