关联类型 | 等效的@property |
---|---|
OBJC_ASSOCIATION_ASSIGN | assign |
OBJC_ASSOCIATION_RETAIN_NONATOMIC | nonatomic,retain |
OBJC_ASSOCIATION_COPY_NONATOMIC | nonatomic,copy |
OBJC_ASSOCIATION_RETAIN | retain |
OBJC_ASSOCIATION_COPY | copy |
在category中的使用 @property添加属性 ,不会生成带下划线的成员变量,也不会有setter和getter方法实现,所以我们通过runtime关联对象的技术为已经存在的类添加“属性”,这样我们只是实现了setter和getter方法,依然不会有带下划线的成员变量
#import "Phone.h"
@interface Phone (Info)
@property (nonatomic,copy) NSString *name;
@end
#import "Phone+Info.h"
#import <objc/runtime.h>
//定义常量 必须是C语言字符串
static const char *key = "name";
@implementation Phone (Info)
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name{
return objc_getAssociatedObject(self, key);
}
@end
#import "ViewController.h"
#import "Phone.h"
#import "Phone+Info.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Phone *phone = [[Phone alloc]init];
phone.name = @"I'm iphone";
NSLog(@"%@",phone.name);
}
@end
log:I'm iphone
#import <UIKit/UIKit.h>
typedef void(^ButtonClickCallBack) (UIButton *button);
@interface UIButton (Base)
- (void)handleClickCallBack:(ButtonClickCallBack)callBack;
@end
#import "UIButton+Base.h"
#import <objc/runtime.h>
static const char *key = "Click";
@implementation UIButton (Base)
- (void)handleClickCallBack:(ButtonClickCallBack)callBack{
objc_setAssociatedObject(self, key, callBack, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
}
- (void)buttonClicked{
ButtonClickCallBack callBack = objc_getAssociatedObject(self, key);
if (callBack) {
callBack(self);
}
}
@end
#import "ViewController.h"
#import "UIButton+Base.h"
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
[button setFrame:CGRectMake(100, 100, 100, 100)];
[button handleClickCallBack:^(UIButton *button) {
NSLog(@"button clicked");
}];
[self.view addSubview:button];
}
@end
log: button clicked
Effective+Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法