#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