问题:如何访问并修改一个类的私有属性?
2020-08-21 本文已影响0人
姜小舟
首先定义拥有私有属性name的Person类
Person.h文件 @interface Person : NSObject @private //name为私有属性 @property (nonatomic, copy) NSString *name; @end
Person.m文件 @implementation Person @end
方法一:KVC(键值编码)
在某控制器中访问或修改Person类的私有属性name
首先记得引入头文件,然后看下面具体实现@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; Person *p = [Person new]; //修改私有属性的值 [p setValue:@"两根手指敲代码" forKey:@"name"]; //访问私有属性的值 NSString *name = [p valueForKey:@"name"]; }
方法二:通过runtime获取或修改一个类私有属性的值
在某控制器中访问或修改Person类的私有属性name
首先记得引入头文件,然后看下面具体实现@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; Person *p = [Person new]; // IVar是runtime声明的一个宏 unsigned int count = 0; //count记录变量的数量 // 获取类的所有属性变量 Ivar *members = class_copyIvarList([Person class], &count); for (int i = 0; i < count; i++) { Ivar ivar = members[i]; // 取得属性名并转成字符串类型 const char * ivarName = ivar_getName(ivar); String name = strcmp(ivarName, "_name"); if (strcmp(ivarName, "_name") == 0) { // 修改属性值 object_setIvar(Person, ivar, @"两根手指敲代码"); } } }
方法三:msg_send() 去修改 (适用私有属性,不适用私有变量)
既然是私有属性了,必然有setter方法, 那我们动态调用一下。
@implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; Person *person = [[Person alloc] init]; ((void (*)(id, SEL, id))(void *) objc_msgSend)((id) person, @selector(setName:) , @"两根手指敲代码"); }