1、分类默认是不能添加属性的,这里我们用runtime实现给分类添加属性,本例给UIView添加一个string属性,分类中.h代码如下
#import <UIKit/UIKit.h>
@interface UIView (String)
@property (nonatomic ,copy) NSString *testStr;
// set和get方法系统会自动生成,这里可以不用写
//- (void)setTestStr:(NSString *)testStr;
//
//- (NSString *)testStr;
@end
2、 .m中,如果直接添加属性会报错,如下
所以此时借助runtime,实现动态添加属性,代码如下
#import "UIView+String.h"
#import <objc/runtime.h>
@implementation UIView (String)
static char overview;
- (void)setTestStr:(NSString *)testStr
{
objc_setAssociatedObject(self, &overview, testStr, OBJC_ASSOCIATION_COPY);
// OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用
// OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不使用原子性
// OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使用原子
// OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性
// OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性
}
- (NSString *)testStr
{
return objc_getAssociatedObject(self, &overview);
}
@end
3、 在其他控制器中的使用,代码如下
#import "ViewController.h"
#import "UIView+String.h"
@interface ViewController ()
{
NSString *viewControllerStr;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *view = [[UIView alloc] init];
view.testStr = @"nihao";
viewControllerStr = view.testStr;
[self assignment];
}
- (void)assignment
{
NSLog(@"%@",viewControllerStr);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end