---聲明---
#import <Foundation/Foundation.h>
@interface NSObject (Name)
@property (nonatomic, strong) NSString *name;
@end
---實現(xiàn)---
#import "NSObject+ Name.h"
#import <objc/message.h>
@implementation NSObject (Name)
- (NSString *)name {
// 利用參數(shù)key 將對象object中存儲的對應值取出來
return objc_getAssociatedObject(self, @"name");
}
- (void)setName:(NSString *)name {
// 將某個值跟某個對象關(guān)聯(lián)起來贝淤,將某個值存儲到某個對象中
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
---調(diào)用---
NSObject *objc = [[NSObject alloc]init];
objc.name = @"set name";
NSLog(@"runtime 動態(tài)添加屬性:%@", objc.name);
---輸出---
runtime 動態(tài)添加屬性:set name
我們成功在分類上添加了一個屬性喝噪,實現(xiàn)了它的 setter 和 getter 方法捣域。 通過關(guān)聯(lián)對象實現(xiàn)的屬性的內(nèi)存管理也是有 ARC 管理的故觅,所以我們只需要給定適當?shù)膬?nèi)存策略就行了燥撞,不需要操心對象的釋放座柱。
這里用到了兩個方法:
id objc_getAssociatedObject(id object, const void *key);
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
object: 被關(guān)聯(lián)的對象。
key: 關(guān)聯(lián)的 key 值物舒,要求唯一色洞。
value: 關(guān)聯(lián)的對象。
objc_AssociationPolicy: 內(nèi)存管理策略冠胯』鹬睿可以理解為 property 的修飾關(guān)鍵字。