OC学习之分类添加属性

2016-04-04  本文已影响229人  龙马君

分类添加的属性要生成get和set方法,不会自动产生私有变量。需要调用runtime里面的方法,进行关联对象。

代码如下:

// 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方法,不会产生私有变量。
// 需要调用runtime里面的方法,进行关联对象。
// 方法一:定义静态变量,采用静态变量的地址。
// 方法二:直接使用get函数的地址

// _cmd在Objective-C的方法中表示当前方法的selector,正如同self表示当前方法调用的对象实例一样。
// 相当于函数指针,设置objc_getAssociatedObject和objc_setAssociatedObject的key都为newName函数的指针。
-(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
上一篇下一篇

猜你喜欢

热点阅读