分類添加的屬性要生成get和set方法存筏,不會自動(dòng)產(chǎn)生私有變量。需要調(diào)用runtime里面的方法畏线,進(jìn)行關(guān)聯(lián)對象静盅。
- 方法一:定義靜態(tài)變量,采用靜態(tài)變量的地址寝殴。
- 方法二:直接使用get函數(shù)的地址
代碼如下:
// Person分類
@interface Person( PersonSub )
@property (nonatomic, strong) NSString* newName;
// 新增方法
-(void)newPrint;
@end
#import "PersonSub.h"
#import <objc/runtime.h>
static char kAssociatedNewName;
@implementation Person( PersonSub)
// 分類添加的屬性要生成get和set方法蒿叠,不會產(chǎn)生私有變量刨摩。
// 需要調(diào)用runtime里面的方法盆佣,進(jìn)行關(guān)聯(lián)對象捡需。
// 方法一:定義靜態(tài)變量枉昏,采用靜態(tài)變量的地址。
// 方法二:直接使用get函數(shù)的地址
// _cmd在Objective-C的方法中表示當(dāng)前方法的selector丹皱,正如同self表示當(dāng)前方法調(diào)用的對象實(shí)例一樣酝静。
// 相當(dāng)于函數(shù)指針骄蝇,設(shè)置objc_getAssociatedObject和objc_setAssociatedObject的key都為newName函數(shù)的指針贞绳。
-(NSString *)newName{
return objc_getAssociatedObject(self, _cmd);
//return objc_getAssociatedObject(self, &kAssociatedNewName);
}
-(void)setNewName:(NSString *)newName{
objc_setAssociatedObject(self, @selector(newName), newName, OBJC_ASSOCIATION_RETAIN);
//objc_setAssociatedObject(self, &kAssociatedNewName, newName, OBJC_ASSOCIATION_RETAIN);
}
-(void)newPrint{
NSLog(@"Person newPrint name = %@", name);
}
@end