美文网首页iOS移动开发社区
对于KVC可以更改私有属性的一些补充

对于KVC可以更改私有属性的一些补充

作者: DXSmile | 来源:发表于2016-02-21 13:57 被阅读1375次

    阐述:

    对于KVC可以更改私有属性的一些补充;
    在前面一篇文章中,我有介绍过通过KVC可以更改系统里面属性的权限的问题,但说得不全面,很多地方也就一笔带过了, 今天在这里,我做一些补充,具体的来演示一下,KVC是怎样来更改权限的;
    上一篇文章链接:
    你所不知道的UITabBarButton?

    正文:

    我们直接来验证一下KVC可以更改私有属性;
    看代码:
    首先我先创建一个类,在类里面我定义一个私有的成员变量:

    Person.h文件:

    #import <Foundation/Foundation.h>
    @interface Person : NSObject{
    // 定义一个私有属性
    @private
        int _age;
    }
    // 非私有属性
    @property (nonatomic,copy) NSString *name;
    // 定义一个方法
    -(void)showMessage;
    
    @end
    

    Person.m文件:

    #import "Person.h"
    @implementation Person
    // 实现方法, 输出名字和年龄
    -(void)showMessage{
        NSLog(@"name=%@,age=%d",_name,_age);
    }
    @end
    

    根据这个创建的分类,我们可以得知,如果我们用平时的方法,是没有办法访问到age的, 因为,我这里把age定位就是私有属性, 那么就下来,我就是要访问它,怎么办呢? 对,估计你也想到了, 我要用KVC来访问, 大家看好我接下来的操作:

    //1.首先我现在在控制器类中,初始化一个Person对象,

    //  ViewController.m
    
    #import "ViewController.h"
    #import "Person.h"
    
    @interface ViewController ()
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    // 1. 先初始化一个person对象
        Person *person1=[[Person alloc]init];
    }
    

    // 2. 由于name属性是公开的,所以,我先用KVC直接给name属性赋值, 相信这点大家都能看明白;

    - (void)viewDidLoad {
        [super viewDidLoad];
    // 1. 先初始化一个person对象
        Person *person1=[[Person alloc]init];
    // 2. 由于name属性是公开的,所以,我先用KVC直接给name属性赋值, 相信这点大家都能看明白;
        [person1 setValue:@"Kenshin" forKey:@"name"];
    

    // 3. 接下来,我就要给私有的age赋值了,按理说,我们是访问不了私有属性的, 但是KVC就是这么神奇,它可以访问;

    - (void)viewDidLoad {
        [super viewDidLoad];
    // 1. 先初始化一个person对象
        Person *person1=[[Person alloc]init];
    // 2. 由于name属性是公开的,所以,我先用KVC直接给name属性赋值, 相信这点大家都能看明白;
        [person1 setValue:@"Kenshin" forKey:@"name"];
    
     // 3. 注意即使一个私有变量仍然可以访问
        [person1 setValue:@28 forKey:@"age"];
    
    

    // 4. 接下来我们调用person类中的方法,输出结果查看一下,我们访问到私有属性age是否已经被我们通过KVC的方法赋值成功了呢:

    - (void)viewDidLoad {
        [super viewDidLoad];
    // 1. 先初始化一个person对象
        Person *person1=[[Person alloc]init];
    // 2. 由于name属性是公开的,所以,我先用KVC直接给name属性赋值, 相信这点大家都能看明白;
        [person1 setValue:@"Kenshin" forKey:@"name"];
     // 3. 注意即使一个私有变量仍然可以访问
        [person1 setValue:@28 forKey:@"age"];
    
    // 4. 调用方法 输出结果
        [person1 showMessage];
    }
    

    测试结果:

    13:34:23.853 KVC[2786:367096] name=Kenshin,age=28

    通过结果可以看出, 我们用KVC不仅可以给公开的变量赋值:name=Kenshin, 同样可以给私有的变量赋值,age=28,访问私有变量完全是没有问题的,

    那KVC既然可以给私有变量赋值, 我们是不是就可以肆无忌惮的使用这种方式来串改苹果系统规定过的私有变量或者只读权限呢?

    当然不是了, 苹果系统底层既然已经规定了每个属性的权限,那么肯定是由他的道理的, KVC虽然具有这个功能, 但不是说我们可以随意改, 因为,在app上架前审核的过程中,苹果官方是会对这类做法严格检查的, 如果有发现,你的审核是通过不了的;
    那既然是这样,苹果为什么又要提供KVC的方式呢? 因为在苹果看来,KVC的方式是一种非常高效的手段, 一句代码即可解决很多繁琐的工作量, 既优美,又简洁方便, 虽然苹果提供了这个KVC的方法, 但是他们并不是让我们随意可以更改系统的权限的, 因为,如果随意的更改系统权限,是会有可能引发严重的信息安全风险的, 这也就是我们常说的"使用不当"的意思;

    但是,如果,我们仅仅是去修改我们自定义的类里面的私有属性和权限,这个是没什么大问题的,所以,对于前面的那篇文中提到的修改系统底层的tabBar的readonly权限,我们也要做相应的其他设置, 最好的方式还是用代理来实现对tabBar的自定义, 具体的实现,我后期有时间会给大家做一个分享了, 今天就指讨论KVC可以更改私有属性的问题;

    如有不妥的地方,望大家斧正!!!

    相关文章

      网友评论

        本文标题:对于KVC可以更改私有属性的一些补充

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