美文网首页iOS 收藏篇面试题
问题:如何访问并修改一个类的私有属性?

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

作者: 姜小舟 | 来源:发表于2020-08-21 09:51 被阅读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:) , @"两根手指敲代码");
    }
    

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ojlrjktx.html