使用KVC
KVC是Key Value Coding的簡稱,意思是鍵值編碼,號稱Cocoa的大招。它是一種可以直接通過字符串key(對象在名稱)來訪問或修改對象屬性的機制。
使用
1.利用KVC可以隨意修改一個對象的屬性或者成員變量(私有的也可以修改)。
其中,key為被修改對象的名稱或者其成員變量名稱。
#import <UIKit/UIKit.h>@interface MainTabBarController : UITabBarController @end @implementation MainTabBarController- (void)viewDidLoad {[super viewDidLoad]; // ZTTabBar是自定義的tabBar,這里要修改系統空間為自定義tabBar ZTTabBar *tabBar = [[ZTTabBar alloc] init]; // self.tabBar = tabBar; 這里會報錯,原因tabBar為readonly,所以這里考慮使用KVC。 [self setValue:tabBar forKeyPath:@"tabBar"]; } @end2.KVC: forKey、forKeyPath的區別,建議使用forKeyPath
下面有兩個示例類:
(這個人很喜歡養狗)
類:Person
.h
.m
#import "Person.h"@implementation Person { @private double _height; // 身高 } @end類Dog
.h
.m
#import "Dog.h"@implementation Dog @end使用KVC修改屬性:
- (void)testKVC {Person *p = [[Person alloc] init];// 1.propertyp.name = @"rose";p.age = 20;p.dog = [[Dog alloc] init];p.dog.name = "旺財"; // 2.forkey [p setValue:@"jack" forKey:@"name"]; [p setValue:@30 forKey:@"age"]; [p.dog setValue:@"旺福" forKey:@"name"]; //Person對象的私有變量_height,對兩個key:height\_height,任意一個key都可以修改其屬性。 //(對于height,KVC先從內存中尋找對應名為height的屬性,如果找不到就會自動尋找_height,然后進行相應的修改) [p setValue:@1.80 forKey:@"height"]; [p setValue:@1.85 forKey:@"_height"]; // 3.forKeyPath // forKeyPath包含了forKey的功能,以后使用forKeyPath就可以了。 // forKeyPath可以利用‘ . ’運算符一層一層往下查找對象的屬性 [p setValue:@"jack" forKeyPath:@"p.name"]; [p setValue:@30 forKeyPath:@"p.age"]; [p setValue:@"哈士奇" forKeyPath:@"dog.name"]; NSLog(@"%d %@", p.age, p.name); }3. KVC取值
- (void)useKVCGetValue {Person *p = [[Person alloc] init];p.dog = [[Dog alloc] init];[p setValue:@"妞妞" forKeyPath:@"dog.name"]; NSLog(@"%@", [p valueForKeyPath:@"dog.name"]); }4.KVC Tips
- (void)test {Person *p = [[Person alloc] init];Dog *dog1 = [[Dog alloc] init];dog1.name = @"中華田園犬"; // 看家還得看土狗dog1.number = 3; Dog *dog2 = [[Dog alloc] init]; dog2.name = @"哈士奇"; // 二貨,這玩意不能多養 dog2.number = 1; Dog *dog3 = [[Dog alloc] init]; dog3.name = @"柴犬"; dog3.number = 4; Dog *dog4 = [[Dog alloc] init]; dog3.name = @"薩摩耶"; dog3.number = 3; Dog *dog5 = [[Dog alloc] init]; dog5.name = @"黑背"; dog5.number = 3; p.dogs = @[dog1, dog2, dog3, dog4, dog5]; 1. tip1:取指定數組 // 取出dogs數組中每一個元素的name屬性值,放到一個新的數組中返回 NSArray *dogNames = [p valueForKeyPath:@"dogs.name"]; 2.tip2: @sum(求和),@avg(求平均數),更多tip請百度。 // 計算所有狗的個數 NSNumber *dogsNumber = [p valueForKeyPath:@"dogs.@sum.number"]; NSLog(@"%@", sumNumber); }總結
總結
- 上一篇: linux命令s
- 下一篇: Java中的代码点和代码单元