问题:如何访问并修改一个类的私有属性?

首先定义拥有私有属性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:) , @"两根手指敲代码");
}

你可能感兴趣的:(问题:如何访问并修改一个类的私有属性?)