記得剛做開發(fā)的時(shí)候矢渊,給分類添加屬性,使用的時(shí)候老是造成奔潰枉证,后來(lái)才發(fā)現(xiàn)在分類中屬性定義某個(gè)變量矮男,則只會(huì)對(duì)該變量生成set,get方法的聲明室谚,不會(huì)生成實(shí)現(xiàn)毡鉴,需要自己去寫實(shí)現(xiàn)方法崔泵,也不會(huì)生成帶下劃線的成員變量。若要是想讓外界訪問(wèn)該成員變量猪瞬,1:可以在分類中用static定義全局變量管削,在get方法的實(shí)現(xiàn)中返回該成員變量 弊端:當(dāng)該類銷毀的時(shí)候,該屬性的成員變量也不會(huì)銷毀 2:在分類中利用runtime動(dòng)態(tài)添加屬性
*/
使用runtime給分類添加屬性
#import <Foundation/Foundation.h>
@interface NSObject (Property)
/**
* 1:@property分類:只會(huì)生成get,set方法聲明,不會(huì)生成實(shí)現(xiàn),需要自己手動(dòng)去生成實(shí)現(xiàn)方法撑螺,也不會(huì)生成下劃線成員屬性含思,可以用static定義下劃線的成員變量在手動(dòng)實(shí)現(xiàn)的get方法中返回,也可以用runtime實(shí)現(xiàn)動(dòng)態(tài)添加屬性
2:因?yàn)樵诜诸愔卸x的屬性不會(huì)生成下劃線的成員變量甘晤,所以可以省略不寫策略方式含潘,只寫定義就可以了@property NSString *name;
*/
@property NSString *name;
@end
#import "NSObject+Property.h"
#import <objc/message.h>
/**
* 1:runtime動(dòng)態(tài)添加屬性: 1:為系統(tǒng)的類寫分類,并屬性定義變量线婚,可以不寫策略遏弱,并手動(dòng)實(shí)現(xiàn)set和get方法
2:在set方法中可以利用runtime實(shí)現(xiàn)動(dòng)態(tài)添加屬性
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
object:給哪個(gè)對(duì)象添加屬性
key:屬性名稱
value:屬性值
policy:保存策略
2:在set方法中可以將該值取出來(lái):objc_getAssociatedObject(self, @"name");
*/
@implementation NSObject (Property)
//static NSString *_name;
- (void)setName:(NSString *)name
{
// 讓這個(gè)字符串與當(dāng)前對(duì)象產(chǎn)生聯(lián)系
// _name = name;
// object:給哪個(gè)對(duì)象添加屬性
// key:屬性名稱
// value:屬性值
// policy:保存策略
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name
{
return objc_getAssociatedObject(self, @"name");
}
@end
#import "ViewController.h"
#import "Person.h"
#import "NSObject+Property.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"123";
NSLog(@"%@",objc.name);
// 創(chuàng)建字符串對(duì)象
// NSString *str = [NSString stringWithString:@"123"];
//
// Person *p = [[Person alloc] init];
//
// p.name = str;
}
@end