给系统的类动态添加属性


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容