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.給分類添加屬性

* 原理:給一個類聲明屬性,其實本質就是給這個類添加關聯,並不是直接把這個值的內存空間添加到類存空間。

 

```

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

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

    

    // 給系統NSObject類動態添加屬性name

    

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

    objc.name = @"小碼哥";

    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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM