// NSObject分類(lèi)
// NSObject.h
#import <Foundation/Foundation.h>
@interface NSObject (Property)
// @property在分類(lèi)中作用:僅僅是生成get,set方法聲明,不會(huì)生成get,set方法實(shí)現(xiàn)和下劃線(xiàn)成員屬性
/** 姓名 */
@property (nonatomic, strong) NSString *name;
@end
// NSObject.m
#import "NSObject+Property.h"
#import <objc/message.h>
@implementation NSObject (Property)
// 只要想調(diào)用runtime方法,思考:誰(shuí)的事情
- (void)setName:(NSString *)name {
// 動(dòng)態(tài)添加屬性 = 本質(zhì):讓對(duì)象的某個(gè)屬性與值產(chǎn)生關(guān)聯(lián)
/*
object:保存到哪個(gè)對(duì)象中
key:用什么屬性保存 屬性名,這個(gè)可以隨便寫(xiě)
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添加一個(gè)name屬性,動(dòng)態(tài)添加屬性 -> runtime
屬性的本質(zhì):讓屬性與某個(gè)對(duì)象產(chǎn)生一段關(guān)聯(lián)
使用場(chǎng)景:給系統(tǒng)的類(lèi)添加屬性
*/
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSObject *objc = [[NSObject alloc] init];
objc.name = @"123";
NSLog(@"==%@", objc.name);
}
@end
// 可以用黑魔法用自己寫(xiě)的方法和系統(tǒng)的方法交換脸哀,但是注意了署惯,不要隨便亂用泊窘,萬(wàn)一出了什么莫名其妙的Bug,也許就是你亂用黑魔法造成的。原因可能比較難找。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者