给系统的类动态添加属性
2016-12-11 本文已影响21人
Z了个L
// NSObject分类
// NSObject.h
#import <Foundation/Foundation.h>
@interface NSObject (Property)
// @property在分类中作用:仅仅是生成get,set方法声明,不会生成get,set方法实现和下划线成员属性
/** 姓名 */
@property (nonatomic, strong) NSString *name;
@end
// NSObject.m
#import "NSObject+Property.h"
#import <objc/message.h>
@implementation NSObject (Property)
// 只要想调用runtime方法,思考:谁的事情
- (void)setName:(NSString *)name {
// 动态添加属性 = 本质:让对象的某个属性与值产生关联
/*
object:保存到哪个对象中
key:用什么属性保存 属性名,这个可以随便写
value:保存值
policy:策略,strong,weak
*/
objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, @"name");
}
@end
// ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
// ViewController.m
#import "ViewController.h"
#import "NSObject+Property.h"
/*
runtime:不要随便去用
需求:给NSObject添加一个name属性,动态添加属性 -> runtime
属性的本质:让属性与某个对象产生一段关联
使用场景:给系统的类添加属性
*/
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"123";
NSLog(@"==%@", objc.name);
}
@end
// 可以用黑魔法用自己写的方法和系统的方法交换,但是注意了,不要随便乱用,万一出了什么莫名其妙的Bug,也许就是你乱用黑魔法造成的。原因可能比较难找。