亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Object-C—KVC

2019-11-14 17:59:24
字體:
來源:轉載
供稿:網友

 

1:使用kvc存取對象屬性

如果要更改對象屬性可以通過什么方法達到呢?

(1)通過setter和getter方法。

(2)屬性。

(3)直接設置實例變量。

今天學習新的一種方法:鍵值編碼-kvc。通過指定要訪問的屬性名字的字符串標識符,可以進行類的屬性的讀取和設置。

鍵值編碼基本調用包括:setValue:forKey:和valueForKey。

栗子:

新建Student類,屬性及成員變量:

@interface Student : NSObject{    @public    NSString * name;    @PRivate    NSString * hobby;}@property(strong,nonatomic) NSString * address;@property(nonatomic) int age;@end

通過setter和getter方法、屬性可以設置屬性:

    Student * stu1 = [Student new];    stu1->name = @"haha";    NSLog(@"%@",stu1->name);            stu1.address = @"street";    //屬性可通過點語法設置    stu1.age = 100;    NSLog(@"address:%@,age:%d",stu1.address,stu1.age);

***下邊通過鍵值編碼kvc設置***

    Student * stu1 = [Student new];    [stu1 setValue:@"kvcName" forKey:@"name"];    NSLog(@"kvc設置name:%@",[stu1 valueForKey:@"name"]);            [stu1 setValue:@18 forKey:@"age"];  //int基本型的需要包裝成oc對象型的    NSLog(@"kvc設置age:%@",[stu1 valueForKey:@"age"]);

通過kvc也可以設置屬性,甚至于private的成員變量也可以設置,Student類中有一個private的成員變量:hobby

    //private的屬性仍然能夠通過kvc設置,所以kvc破壞了面向對象的封裝思想    [stu1 setValue:@"read" forKey:@"hobby"];    NSLog(@"%@",[stu1 valueForKey:@"hobby"]);

既然都可以設置屬性,那么kvc和其他的有什么區別呢?它的使用場景是什么呢?

1:

key返回NSString類型的字符串??梢詥为毺岢鰜恚?/p>

    Student * stu1 = [Student new];    NSString * key = @"name";  //變量 靈活    //[stu1 setValue:@"kvcName" forKey:@"name"];    [stu1 setValue:@"kvcName" forKey:key];    NSLog(@"kvc設置name:%@",[stu1 valueForKey:@"name"]);

這樣key相當于是一個中間變量,無疑大大增強了靈活性。

2:類似id型對象不能點語法的,那么可以通過kvc設置。如:

    id obj = stu1;    //id 不能通過點語法設置屬性    obj.name = @"hehe";    //報錯    [obj setValue:@"idName" forKey:@"name"];    NSLog(@"id設置的name:%@",[obj valueForKey:@"name"]);

2:kvc特點:鍵搜索順序

kvc首先查找的是setter命名的屬性,為證實,重寫setter,如果setter被調用則可以證實。

以Student的name成員變量為例,寫setter方法:

- (void)setName:(NSString *)newName{    NSLog(@"kvc......");    self->name = newName;}

如果被調用則會打印kvc......,

main函數中:

    Student * stu1 = [Student new];    NSString * key = @"name";      [stu1 setValue:@"kvcName" forKey:key];    NSLog(@"kvc設置name:%@",[stu1 valueForKey:@"name"]);

打印結果:

驗證了。。。。。。如果不存在getter呢?也就是說不能用屬性(屬性會自動生成setter和getter方法),那么則會在對象內部查找_key或key的實例變量。

以Student的hobby為例,它不是屬性,用沒有寫setter方法,現在聲明hobby和_hobby,為了驗證寫了一個test方法:

@interface Student : NSObject{    @public    NSString * name;    @private    NSString * hobby;    NSString * _hobby;}@property(strong,nonatomic) NSString * address;@property(nonatomic) int age;- (void)test;

test方法:

- (void)test{    NSLog(@"_hobby = %@",self->_hobby);    NSLog(@"hobby = %@",self->hobby);}

那么當main中hobby通過kvc設置的時候,會發生什么?

    Student * stu1 = [Student new];    [stu1 setValue:@"read" forKey:@"hobby"];    [stu1 test];

按說這是給hobby設置值,打印結果:

結果_hobby上有值,這就證實kvc先查找_key。

注意:使用@property+@synthesize可以自動生成getter和setter,但是如果為其指定非標準的getter和setter,key的搜索則會出現問題。

2:鍵值編碼的鍵路徑

設想以下情況:添加一個Brother類,Student有一個屬性是Brother對象。

@interface Student : NSObject{    @public    NSString * name;    @private    NSString * hobby;    NSString * _hobby;}@property(strong,nonatomic) NSString * address;@property(nonatomic) int age;//添加brother屬性@property(strong,nonatomic)Brother * brother;- (void)setName:(NSString *)newName;- (void)test;@end

而Brother類下有一個屬性broName?,F在有這么一個需求:我需要通過Student給brother下的broName賦值。(不是通過brother)

那么代碼似乎應該這么寫:

    Student * stu1 = [Student new];    Brother * bro1 = [Brother new];    stu1.brother = bro1;    [stu1 setValue:@"兄弟" forKey:@"bro1.broName"];    NSLog(@"%@",[bro1 valueForKey:@"broName"]);      //崩潰

這么寫代碼崩潰,那該怎么寫呢?使用鍵路徑:setValue:forKeyPath:

假設a對象下有一個名為b的屬性,而b中包含了名稱為c的屬性,如果想要從a獲?。ɑ蛟O置)c屬性的內容需要使用如下路徑來描述: b.c (遇到點會解析成路徑)

    Student * stu1 = [Student new];    Brother * bro1 = [Brother new];    stu1.brother = bro1;    [stu1 setValue:@"兄弟" forKeyPath:@"brother.broName"];    NSLog(@"%@",[stu1 valueForKeyPath:@"brother.broName"]);

這樣就可以了,上面的代碼稍作修改:現在brother下有一個brother對象brotherOld屬性,該怎么賦值呢?

@interface Brother : NSObject@property(strong,nonatomic) NSString * broName;@property(strong,nonatomic) Brother * brotherOld;@end

這樣相當于通過兩層去設置值。

    Student * stu1 = [Student new];    Brother * bro1 = [Brother new];    stu1.brother = bro1;            Brother * bigBrother = [Brother new];    bro1.brotherOld = bigBrother;    [stu1 setValue:@"大兄弟" forKeyPath:@"brother.brotherOld.broName"];    NSLog(@"%@",[stu1 valueForKeyPath:@"brother.brotherOld.broName"]);

3:鍵不存在的情況(了解即可)

為一個不存在的鍵setValue forKey的話,會報錯,比如:

[stu1 setValue:@"mei you zhe ge jian" forKey:@"notExist"];    //崩潰

可以實現setValue:forUndefinedKey:

Student下聲明一個字典:NSMutableDictionary * undefinedKeysAndValues可以存到這個字典中(相當于臨時容器)

Student.m文件

//以下兩個方法一般不重寫-(void)setValue:(id)value forUndefinedKey:(NSString *)key{        NSLog(@"呵呵,你所訪問的鍵:%@不存在,你就別想把值:%@放到這個鍵上了,說的就跟你有這個鍵似的!",key,value);    //[self->undefinedKeysAndValues setObject:value forKey:key];}-(id)valueForUndefinedKey:(NSString *)key{    NSLog(@"對不起,沒有這樣的鍵!");    return nil;    //return [self->undefinedKeysAndValues objectForKey:key];}@end

4:字典的valueForKey:

    NSDictionary * dict = @{@"aaa":@"11111111",@"bbb":@"22222222222"};    //NSLog(@"%@",[dict objectForKey:@"aaa"]);    NSLog(@"%@",[dict valueForKey:@"aaa"]);

打印結果:

2015-11-06 19:40:30.445 oc-kvc-001[846:61032] 11111111

Program ended with exit code: 0

本來字典的取值是通過objectForKey,現在也能通過valueForKey取值,說明valueForKey是NSobject的方法,字典繼承自NSobject

5:操作集合

如果對象的某個實例變量為NSArray,而其中存放的又是對象。

Team.h文件:

@interface Team : NSObject@property(strong,nonatomic) NSArray * members;@end

Student.h文件:

@interface Student : NSObject@property(copy,nonatomic) NSString * name;@property(nonatomic) int age;@end

Team下有一個屬性為members的數組,members數組中存放的是Student對象。

        Student * s1 = [Student new];        s1.name = @"學生甲";        s1.age = 1000;                Student * s2 = [Student new];        s2.name = @"學生乙";        s2.age = 28;                Student * s3 = [Student new];        s3.name = @"學生丙";        s3.age = 1100;                Student * s4 = [Student new];        s4.name = @"學生丁";        s4.age = 1400;                NSArray * arr = @[s1,s2,s3,s4];                //對NSArray請求一個鍵值,則會查詢數組中的每一個對象來查找這個鍵,然后將這些結果重新打包為一個NSArray        id ages = [arr valueForKey:@"age"];        NSLog(@"%@",ages);        
//可以取最大值、最小值、求和、平均值、個數。
id maxAge = [arr valueForKeyPath:@"@max.age"]; id minAge = [arr valueForKeyPath:@"@min.age"]; id sumAge = [arr valueForKeyPath:@"@sum.age"]; id avgAge = [arr valueForKeyPath:@"@avg.age"]; id count = [arr valueForKeyPath:@"@count"]; NSLog(@"%@,%@,%@,%@,%@",maxAge,minAge,sumAge,avgAge,count); Team * team = [Team new]; team.members = arr; maxAge = [team valueForKeyPath:@"members.@max.age"]; minAge = [team valueForKeyPath:@"members.@min.age"]; sumAge = [team valueForKeyPath:@"members.@sum.age"]; avgAge = [team valueForKeyPath:@"members.@avg.age"]; count = [team valueForKeyPath:@"members.@count"]; NSLog(@"%@,%@,%@,%@,%@",maxAge,minAge,sumAge,avgAge,count);

 

啊╮(╯▽╰)╭,結束。。。。。。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品海角社区在线观看| 亚洲美女性视频| 欧美成人午夜激情视频| 国产区精品在线观看| 精品国产户外野外| 欧美老女人在线视频| 在线激情影院一区| 国产日韩在线一区| 热re91久久精品国99热蜜臀| 亚洲精品资源在线| 国模叶桐国产精品一区| 国产成人精品日本亚洲专区61| 九九热这里只有精品免费看| 日韩高清中文字幕| 国产深夜精品福利| 最新中文字幕亚洲| 国产精品偷伦免费视频观看的| 欧亚精品中文字幕| 久久久亚洲成人| 欧美亚洲国产成人精品| 最近2019中文字幕一页二页| 亚洲国产精品成人精品| 国产视频综合在线| 亚洲国产女人aaa毛片在线| 国产美女扒开尿口久久久| 亚洲香蕉在线观看| 精品国产一区二区三区久久狼黑人| 国产精品第100页| 久久综合伊人77777蜜臀| 亚洲精品不卡在线| 最近中文字幕2019免费| 国产成人拍精品视频午夜网站| 日韩一区av在线| 欧美视频在线观看 亚洲欧| 国产精品99免视看9| 亚洲欧美三级在线| 91精品久久久久久久久久另类| 青青青国产精品一区二区| 97热精品视频官网| 国产精品视频在线观看| 欧美国产在线电影| 日本久久久久久久| 国产xxx69麻豆国语对白| 91精品国产乱码久久久久久久久| 国产美女精品免费电影| 久久亚洲精品视频| 成人福利在线视频| 日本一区二区三区在线播放| 中文国产亚洲喷潮| 久久电影一区二区| 欧美日韩国产黄| 欧美激情乱人伦一区| 欧美精品在线免费观看| 91国语精品自产拍在线观看性色| 欧美一级淫片videoshd| www日韩欧美| 久久九九全国免费精品观看| 国产91在线高潮白浆在线观看| 久青草国产97香蕉在线视频| 91伊人影院在线播放| 欧美高清视频在线播放| 欧美精品国产精品日韩精品| 国产黑人绿帽在线第一区| 2019中文字幕在线免费观看| 日韩在线免费视频观看| 日韩在线观看免费网站| 国产精品欧美激情| 国产专区精品视频| 国产91色在线|免| 亚洲成人中文字幕| 久久精品视频中文字幕| 日韩av在线免费看| 91成人性视频| 国产精品网站视频| 精品国产自在精品国产浪潮| 欧美人与物videos| 色偷偷av一区二区三区乱| 午夜精品美女自拍福到在线| 欧美日韩亚洲成人| 欧美精品在线免费| 日韩亚洲第一页| 欧美一区二区三区图| 亚洲精品乱码久久久久久金桔影视| 国产精品一区二区三区毛片淫片| 国产精品老女人视频| 91精品久久久久久久久久| 国产脚交av在线一区二区| 午夜伦理精品一区| 日韩精品免费一线在线观看| 欧美激情第6页| 国产精品电影在线观看| 欧美寡妇偷汉性猛交| 高潮白浆女日韩av免费看| 精品女同一区二区三区在线播放| 精品自拍视频在线观看| 日本精品一区二区三区在线播放视频| 久久五月天综合| 亚洲成年人影院在线| 国产激情视频一区| 亚洲美女av网站| 中文字幕av一区中文字幕天堂| 亚洲自拍偷拍色图| 777午夜精品福利在线观看| 日韩精品在线免费观看视频| 日韩久久精品电影| 欧美在线观看日本一区| 最近免费中文字幕视频2019| 成人免费激情视频| 97视频在线观看视频免费视频| 亚洲欧洲日本专区| 欧美成年人视频网站欧美| 国产一区二区三区在线看| 欧美日韩一区免费| 狠狠色狠狠色综合日日五| 4444欧美成人kkkk| 欧美日韩激情网| 97色伦亚洲国产| 欧美精品一区三区| 国产精品综合不卡av| 亚洲精品视频久久| 国产精品日韩在线一区| 国产视频在线一区二区| 成人xvideos免费视频| 亚洲欧美日韩天堂| 日韩毛片在线看| 精品国产一区二区在线| 国产欧美精品一区二区三区-老狼| 久久精品免费电影| 欧美精品在线第一页| 欧美精品一二区| 午夜精品视频网站| 国产精品狠色婷| 国产噜噜噜噜噜久久久久久久久| 亚洲天堂影视av| 欧美电影免费观看高清完整| 欧美肥臀大乳一区二区免费视频| 亚洲天堂男人的天堂| 91精品国产综合久久香蕉922| 欧美大片网站在线观看| 亚洲欧美在线看| 日韩免费视频在线观看| 日本国产高清不卡| 日韩欧美黄色动漫| 亚洲第一免费播放区| 久久久电影免费观看完整版| 国产精品pans私拍| 久久精品久久精品亚洲人| 午夜精品美女自拍福到在线| 青青a在线精品免费观看| 精品国产一区二区三区久久| 日韩精品免费在线视频| 亚洲国产精品高清久久久| 国产小视频国产精品| 欧美性xxxx极品高清hd直播| 久久精品色欧美aⅴ一区二区| 日韩禁在线播放| 一本色道久久88精品综合| 日韩成人中文字幕| 国产91久久婷婷一区二区| 91精品国产综合久久香蕉的用户体验| 亚洲一区久久久| 啪一啪鲁一鲁2019在线视频| 欧美一区亚洲一区| 久久国产精品久久国产精品|