美文网首页React Native开发
iOS修改私有属性&&成员变量(KVC)

iOS修改私有属性&&成员变量(KVC)

作者: 码工人生 | 来源:发表于2021-12-05 22:59 被阅读0次

    一、概述

    修改私有属性,是我们日常开发中常见的一个场景。比如修改三方库的某个属性,可三方库并没有暴露该属性在头文件。总的来说,修改私有属性,两种方案:KVC和Runtime。今天这里不介绍原理,只讲实操。
    总体思路:通过继承要修改类,拿到要修改的属性或者成员变量,改变其值,再赋值给该类。

    二、KVC

    以下举例,通过子类ZXSonViewController继承父类ZXParentViewController和,在viewDidLoad方法里做演示。

    I、属性类型-系统类

    父类定义了私有属性name


    image.png

    子类继承父类,通过KVC修改


    image.png
    打印结果:
    image.png

    II、属性类型-自定义类

    此时使用的Api由[setValue: forKey:]换为[setValue:forKeyPath:]
    父类使用自定义类一个作为属性


    image.png

    子类通过[setValue:forKeyPath:] 修改


    image.png
    看下打印结果
    image.png

    III、成员变量-非枚举

    当修改的是成员变量时


    image.png

    子类


    image.png
    打印结果
    image.png

    IV、成员变量-枚举

    由于struct本身并不遵循KVC协议,但是我们可以转化为NSValue解决

    父类使用一个枚举做成员变量


    image.png

    子类通过五步操作,修改父类成员变量值

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        /**当修改私有变量时枚举时,由以下五步*/
        
        //1、通过KVC获取父类父类成员变量,赋值给NSValue
        NSValue* result = [self valueForKey:@"location"];
        
        //2、将NSValue转化为结构一样,但名字不一样的新结构体
        struct ZXSonLocation sonLocation;
        [result getValue:&sonLocation];
        
        //3、修改目标字段
        sonLocation.x = 999.0;
        
        //4、将新的结构体再转为NSValue
        NSValue* newValue = [NSValue valueWithBytes:&sonLocation objCType:@encode(struct ZXSonLocation)];
    
        //5、通过KVC赋值给父类
        [self setValue:newValue forKey:@"location"];
    
    }
    

    截图如下


    image.png

    看下打印结果

    image.png

    三、总结

    通过KVC修改私有属性或者成员变量的方法基本都列举完了,但注意KVC本身属于硬编码形式,容易操作闪退,使用时要做好安全防护。

    相关文章

      网友评论

        本文标题:iOS修改私有属性&&成员变量(KVC)

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