objc_getAssociatedObject和objc_se
2017-12-14 本文已影响8人
CoderLJW
一般用于给分类添加【属性和方法】使用
例如给 NSString的分类NSString(JJExtend)添加【title】属性
.h文件
#import <Foundation/Foundation.h>
@interface NSString(JJExtend)
/** 给NSString类动态添加 一个title属性 可以使用 set和get法 也可以使用 点语法 */
\- (void)setTitle:(NSString *)title;
/** 和 set 方法成对使用 */
\- (NSString *)title;
@end
.m文件
#import "NSString+JJExtend.h"
#import <objc/runtime.h> // 需要引入头文件
@implementation NSString(JJExtend)
- (void)setTitle:(NSString *)title
{
// OBJC_ASSOCIATION_COPY == copy 代表关联策略 和 @property的设置相同
// @selector(title) 也可以设置 静态的 唯一key static const char xxxxKey; 使用时 &xxxxKey
objc_setAssociatedObject(self, @selector(title), title, OBJC_ASSOCIATION_COPY);
}
- (NSString *)title
{
// _cmd 代表当前方法名 title
return objc_getAssociatedObject(self, _cmd);
}
@end
调用时
// set 方法调用和点语法通用
[test setTitle:@"aaaaaaa"];
//test.title = @"loujian";
// get 获取
NSLog(@"%@", test.title);
// NSLog(@"%@", [test title]);
给分类添加 Block回调方法使用
.h文件
#import <Foundation/Foundation.h>
typedef void(^BackMsg)(NSString *msg);
@interface NSString(JJExtend)
/** 添加 一个block属性 */
- (void)stringBackBlock:(BackMsg)backMsg;
- (void)backMsg;
@end
.m文件
- (void)stringBackBlock:(BackMsg)backMsg
{
if (backMsg) {
objc_setAssociatedObject(self, @selector(backMsg), backMsg, OBJC_ASSOCIATION_COPY);
}
}
- (void)backMsg
{
// _cmd 代表当前方法名 backMsg
BackMsg bm = objc_getAssociatedObject(self, _cmd);
if (bm) {
bm(self);
}
}
- backMsg方法中返回的是self自身,就是NSString的属性内容,此处也可以替换成在什么时候需要返回的数据。
- 还有更多使用的方法,还请大家贴出来