给系统的类动态添加属性

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,也许就是你乱用黑魔法造成的。原因可能比较难找。

上一篇下一篇

猜你喜欢

热点阅读