KVC的用法

示例1:基本賦值取值spa

@interface Book : NSObject { 
    NString *name;
}
@end.net

#import "Book.h"
@implementation Book
@end日誌

這個Book類太簡單了,只有一個實例變量name。並且,按照之前掌握的技術,沒有辦法給這個變量賦值了。下面KVC登場:對象

Book *book=[[Book alloc] init]; 
[book setValue:@"《Objective-C入門》" forKey:@"name"]; 
NSString *name=[book valueForKey:@"name"]; blog

示例2:使用路徑字符串

@interface Author : NSObject { 
    NSString *name; 
}
@endget

#import "Author.h"
@implementation Author
@endit

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
}
@endio

#import "Book.h"
@implementation Book
@end入門

Book *book=[[[Book alloc] init] autorelease]; 
[book setValue:@"《Objective-C入門》" forKey:@"name"]; 
NSString *name=[book valueForKey:@"name"]; 
    
Author *author=[[[Author alloc] init] autorelease]; 
[author setValue:@"Marshal Wu" forKey:@"name"]; 
[book setValue:author forKey:@"author"]; 
NSString *authorName=[book valueForKeyPath:@"author.name"]; 

示例3:自動裝箱拆箱

KVC還有一個很重要的特色,自動裝箱拆箱功能。這在ObjC中是僅有的,其餘狀況下均須要使用好比NSNumber來手動拆裝箱的。

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
    float price; 
}
@end

實現文件沒有動。

Book *book=[[[Book alloc] init] autorelease]; 
Author *author=[[[Author alloc] init] autorelease]; 
[book setValue:author forKey:@"author"]; 
[book setValue:@"zhangsan" forKeyPath:@"author.name"]; 
[book setValue:@"10.4" forKey:@"price"]; 
NSLog(@"book price is %@",[book valueForKey:@"price"]);

能夠看到給price輸入的是NSString類型,可是沒有問題,由於KVC方式會根據字符串自動轉型爲適當的數值。再看打印price屬性,%@是打印對象,而price屬性是float基本型,這裏KVC確定作

了自動裝箱的處理,將基本型轉爲NSNumber對象。

示例4:對集合的操做能力

KVC還具有對集合的操做能力。好比,圖書能夠有相關圖書,這是個1對多的關係。能夠用集合來表示,這裏用NSArray表示,在Book類的頭文件中改動:

@class Author;
@interface Book : NSObject { 
    NSString *name; 
    Author *author; 
    float price; 
    NSArray *relativeBooks; 
}
@end

若是想獲得相關圖書的價格NSArray,可使用KVC方式,見main方法:

Book *book =[[[Book alloc] init] autorelease]; 
Book *book1=[[[Book alloc] init] autorelease]; 
[book1 setValue:@"5.0" forKey:@"price"]; 
Book *book2=[[[Book alloc] init] autorelease]; 
[book2 setValue:@"4.0" forKey:@"price"]; 
NSArray *books=[NSArray arrayWithObjects:book1,book2,nil]; 
[book setValue:books forKey:@"relativeBooks"]; 
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]);

日誌將打印出相關圖書的價格列表:

2011-05-26 19:27:57.463 ReleaseMemoDemo[10042:a0f] relative books price: ( 
    5, 
    4 
)

示例5:對集合作運算

KVC還能對集合作運算,好比想獲得相關圖書的個數、相關圖書的價格總和、相關圖書的平均價格、價格的最大值和價格的最小值,見下面的代碼:

NSArray *books=[NSArray arrayWithObjects:book1,book2,nil]; 
[book setValue:books forKey:@"relativeBooks"]; 
NSLog(@"relative books price: %@",[book valueForKeyPath:@"relativeBooks.price"]); 
NSLog(@"relative books count: %@",[book valueForKeyPath:@"relativeBooks.@count"]); 
NSLog(@"relative books price sum: %@",[book valueForKeyPath:@"relativeBooks.@sum.price"]); 
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@avg.price"]); 
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@"relativeBooks.@max.price"]);
NSLog(@"relative books price avg: %@",[book valueForKeyPath:@relativeBooks.@min.price]);

另外,若是想得到沒有重複的價格集合,能夠這樣:

NSLog(@"relative books distinct price: %@",[bookvalueForKeyPath:@"relativeBooks.@distinctUnionOfObjects.price"]);

在使用@distinctUnionOfObjects後,發現效果是消除重複的價格。

示例6:更多用法

KVC還能夠在一個語句中爲實例的多個屬性賦值:

Book *book4=[[Book alloc] init]; 
NSArray *bookProperties=[NSArray arrayWithObjects:@"name",@"price",nil]; 
NSDictionary *bookPropertiesDictionary=[book4 dictionaryWithValuesForKeys:bookProperties]; 
NSLog(@"book values: %@",bookPropertiesDictionary);
NSDictionary *newBookPropertiesDictionary=[NSDictionary dictionaryWithObjectsAndKeys:@"《Objective C入門》",@"name", @"20.5",@"price",nil]; 
[book4 setValuesForKeysWithDictionary:newBookPropertiesDictionary]; 
NSLog(@"book with new values: %@",[book4 dictionaryWithValuesForKeys:bookProperties]);
另外,還有兩個比較高級的內容:nil和覆蓋setNilValueForKey方法,覆蓋valueForUndefinedKey方法,可自行看reference瞭解。

 

轉自 http://blog.csdn.net/ajrm0925/article/details/7484678

相關文章
相關標籤/搜索