Tag: NSArray
将Array、Dictionary等集合类的序列化和反序列化
by Elton on 二.15, 2010, under iPhone
Objective-C的集合类序列化到文件中或者从文件中反序列化其实很简单,请看下面的示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | NSArray *array = [NSArray arrayWithObjects: @"Hefeweizen", @"IPA", @"Pilsner", @"Stout", nil]; NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys: array, @"array", @"Stout", @"dark", @"Hefeweizen", @"wheat", @"IPA", @"hoppy", nil]; // 得到documents directory的路径 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); if ([paths count] > 0) { // Array的保存路径 NSString *arrayPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"array.out"]; // dictionary的保存路径 NSString *dictPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"dict.out"]; // 保存array [array writeToFile:arrayPath atomically:YES]; // 保存dictionary [dictionary writeToFile:dictPath atomically:YES]; // 从文件中读取回来 NSArray *arrayFromFile = [NSArray arrayWithContentsOfFile:arrayPath]; NSDictionary *dictFromFile = [NSDictionary dictionaryWithContentsOfFile:dictPath]; for (NSString *element in arrayFromFile) NSLog(@"Beer: %@", element); for (NSString *key in dictFromFile) NSLog(@"%@ Style: %@", key, [dictionary valueForKey:key]); } |
输出如下:

NSArray 和 KVC
by Elton on 十一.04, 2009, under Mac
Theocoacao有篇不错的介绍NSArray和KVC的文章,我给粗略翻译了一下。
NSArray的-valueForKey: 有一个不是很显著的特性. 你可以使用它返回一个由tree对象包装的值对象的数组。这句话可能不是很容易理解,看下面的例子就清楚了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | NSMutableArray * tree = [NSMutableArray array]; NSDictionary * p = nil; // parent NSDictionary * c = nil; // child NSNumber * n = nil; // value int i; for ( i = 0; i < 10; i++ ) { n = [NSNumber numberWithInt: i]; c = [NSDictionary dictionaryWithObject:n forKey: @"someKey"]; p = [NSDictionary dictionaryWithObject: c forKey: @"storage"]; [tree addObject: p]; } NSLog (@"%@", tree); // here's the important part! NSArray * justValues; justValues = [tree valueForKeyPath: @"storage.someKey"]; NSLog (@"%@", justValues); |
第一个NSLog输出的内容t:
1 2 3 4 5 6 7 8 9 10 11 12 13 | NSLog (@"%@", tree); ( {storage = {someKey = 0; }; }, {storage = {someKey = 1; }; }, {storage = {someKey = 2; }; }, {storage = {someKey = 3; }; }, {storage = {someKey = 4; }; }, {storage = {someKey = 5; }; }, {storage = {someKey = 6; }; }, {storage = {someKey = 7; }; }, {storage = {someKey = 8; }; }, {storage = {someKey = 9; }; } ) |
第二个NSLog 返回一个数组的值,这个数组是由封装它的tree对象的 @”storage.someKey”:这个keypath提供的:
1 2 3 4 | NSArray * justValues; justValues = [tree valueForKeyPath: @"storage.someKey"]; NSLog (@"%@", justValues); (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
我发现它真的非常方便,当你使用Core Data要排序一个managed objects对象里面的一个数组的时候。 你可以用一个attribute就把它里面数组的值列出来。.
Objective-C中切分数组
by Elton on 九.11, 2009, under Mac
在很多脚本语言如ruby,python中都有将字符串切分成数组或者将数组元素以某个间隔字符串间隔形成新的数组。 其实NSArray也提供了这样的功能。
使用-componentsSeparatedByString:来切分NSArray。 如:
1 2 | NSString *string = @"white:black:blue:red"; NSArray *aArray = [string componentsSeparatedByString:@":"]; |
用-componentsJoinedByString:来合并NSArray中的各个元素并创建一个新的字符串,如:
1 | string = [aArray componentsJoinedByString:@","]; |
这样,上面的数组就中的各个元素就以”,”分割形成一个字符串。


