首页 > 其他 > 详细

Runtime给分类添加属性

时间:2017-02-06 10:22:29      阅读:207      评论:0      收藏:0      [点我收藏+]

分类中不能添加属性。

在分类中,@property (nonatomic, assign) NSInteger age;只会生成同名的setter和getter方法,不会生成带_的成员变量和对应的setter和getter方法的实现。

 

那怎么给分类添加属性呢?使用运行时可以。

oc有两个运行时方法:

添加属性,在setter方法中调用:objc_setAssociatedObject

获取属性,在getter方法中调用:objc_getAssociatedObject

 

// 本类头文件及实现文件
#import <Foundation/Foundation.h>

@interface Person : NSObject

// 声明一个属性
@property (nonatomic, copy) NSString *name;

@end

#import "Person.h"

@implementation Person
@end
// 分类头文件及实现文件

#import "Person.h"

@interface Person (Extension)

// 分类中声明属性,只会生成setter和getter方法的声明,不会生成带“_”的成员变量和setter和getter方法的实现
@property (nonatomic, assign) NSInteger age;

@end

#import "Person+Extension.h"

// 使用运行时,需要导入头文件
#import <objc/runtime.h>

@implementation Person (Extension)

- (void)setAge:(NSInteger)age{
    // 使用运行时关联对象,person对象(self)强引用age对象,并且设置标记为"age"(可以根据该标记来获取引用的对象age,标记可以为任意字符,只要setter和getter中的标记一致就可以)
    // 参数1:源对象
    // 参数2:关联时用来标记属性的key(因为可能要添加很多属性)
    // 参数3:关联的对象
    // 参数4:关联策略
    objc_setAssociatedObject(self, @"age", @(age), OBJC_ASSOCIATION_RETAIN);
}

- (NSInteger)age{
    // 根据“age”标识取person对象(self)强引用的age对象
    // 参数1:源对象
    // 参数2:关联时用来标记属性的key(因为可能要添加很多属性)
    return [objc_getAssociatedObject(self, @"age") integerValue];
}

@end

调用:

#import "ViewController.h"
#import "Person.h" // 导入本类头文件
#import "Person+Extension.h" // 导入分类头文件

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Person *per = [[Person alloc] init];
    per.name = @"xiaoming"; // 本类中的属性
    per.age = 22; // 分类中的属性
    NSLog(@"%@--%zd",per.name,per.age); // 本类和分类中的属性都可以打印出来,说明都正常存储了数据    
}

@end

 

Runtime给分类添加属性

原文:http://www.cnblogs.com/panda1024/p/6369036.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!