#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