闡述:
對于KVC可以更改私有屬性的一些補充;
在前面一篇文章中,我有介紹過通過KVC可以更改系統(tǒng)里面屬性的權(quán)限的問題,但說得不全面,很多地方也就一筆帶過了, 今天在這里,我做一些補充,具體的來演示一下,KVC是怎樣來更改權(quán)限的;
上一篇文章鏈接:
你所不知道的UITabBarButton?
正文:
我們直接來驗證一下KVC可以更改私有屬性;
看代碼:
首先我先創(chuàng)建一個類,在類里面我定義一個私有的成員變量:
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
// 實現(xiàn)方法, 輸出名字和年齡
-(void)showMessage{
NSLog(@"name=%@,age=%d",_name,_age);
}
@end
根據(jù)這個創(chuàng)建的分類,我們可以得知,如果我們用平時的方法,是沒有辦法訪問到age的, 因為,我這里把age定位就是私有屬性, 那么就下來,我就是要訪問它,怎么辦呢? 對,估計你也想到了, 我要用KVC來訪問, 大家看好我接下來的操作:
//1.首先我現(xiàn)在在控制器類中,初始化一個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. 接下來我們調(diào)用person類中的方法,輸出結(jié)果查看一下,我們訪問到私有屬性age是否已經(jīng)被我們通過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. 調(diào)用方法 輸出結(jié)果
[person1 showMessage];
}
測試結(jié)果:
13:34:23.853 KVC[2786:367096] name=Kenshin,age=28
通過結(jié)果可以看出, 我們用KVC不僅可以給公開的變量賦值:name=Kenshin, 同樣可以給私有的變量賦值,age=28,訪問私有變量完全是沒有問題的,
那KVC既然可以給私有變量賦值, 我們是不是就可以肆無忌憚的使用這種方式來串改蘋果系統(tǒng)規(guī)定過的私有變量或者只讀權(quán)限呢?
當然不是了, 蘋果系統(tǒng)底層既然已經(jīng)規(guī)定了每個屬性的權(quán)限,那么肯定是由他的道理的, KVC雖然具有這個功能, 但不是說我們可以隨意改, 因為,在app上架前審核的過程中,蘋果官方是會對這類做法嚴格檢查的, 如果有發(fā)現(xiàn),你的審核是通過不了的;
那既然是這樣,蘋果為什么又要提供KVC的方式呢? 因為在蘋果看來,KVC的方式是一種非常高效的手段, 一句代碼即可解決很多繁瑣的工作量, 既優(yōu)美,又簡潔方便, 雖然蘋果提供了這個KVC的方法, 但是他們并不是讓我們隨意可以更改系統(tǒng)的權(quán)限的, 因為,如果隨意的更改系統(tǒng)權(quán)限,是會有可能引發(fā)嚴重的信息安全風險的, 這也就是我們常說的"使用不當"的意思;
但是,如果,我們僅僅是去修改我們自定義的類里面的私有屬性和權(quán)限,這個是沒什么大問題的,所以,對于前面的那篇文中提到的修改系統(tǒng)底層的tabBar的readonly權(quán)限,我們也要做相應的其他設置, 最好的方式還是用代理來實現(xiàn)對tabBar的自定義, 具體的實現(xiàn),我后期有時間會給大家做一個分享了, 今天就指討論KVC可以更改私有屬性的問題;
如有不妥的地方,望大家斧正!!!