Foundation之NSArray
一、NSArray的使用
1 int main(int argc, const char * argv[]) 2 { 3 4 @autoreleasepool { 5 6 // 创建有多个元素的数组,nil代表数组元素结束 7 NSMutableString *s1 = [NSMutableString stringWithString:@"a"]; 8 NSMutableString *s2 = [NSMutableString stringWithString:@"b"]; 9 NSMutableString *s3 = [NSMutableString stringWithString:@"c"]; 10 NSArray *arr1 = [NSArray arrayWithObjects:s1, s2, s3, nil]; 11 // 获取数组元素个数 12 NSLog(@"%zi", [arr1 count]); //3 13 // 判断数组中是否包含某个元素 14 BOOL r1 = [arr1 containsObject:@"b"]; 15 NSLog(@"%i", r1); //1 16 // 获取最后一个元素 17 NSLog(@"%@", [arr1 lastObject]); //c 18 // 通过索引获取数组元素 19 NSLog(@"%@", [arr1 objectAtIndex:1]); //b 20 // 查找元素的索引 21 NSLog(@"%zi", [arr1 indexOfObject:@"c"]); //2 22 // 让数组中的每个元素都调用setString:方法 23 [arr1 makeObjectsPerformSelector:@selector(setString:) withObject:@"d"]; 24 NSLog(@"%@", arr1); //(d,d,d) 25 // 使用for遍历数组 26 NSUInteger count = [arr1 count]; 27 for (int i=0; i<count; i++) { 28 NSLog(@"%@", [arr1 objectAtIndex:i]); 29 } 30 // 使用for in遍历数组 31 for (id obj in arr1) { 32 NSLog(@"%@", obj); 33 } 34 // 使用Block遍历数组 35 [arr1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 36 NSLog(@"%zi = %@", idx, obj); 37 if (idx==1) *stop = YES; //遍历到第2个元素终止遍历 38 }]; 39 // 通过迭代器遍历数组 正序 40 NSEnumerator *et1 = [arr1 objectEnumerator]; 41 id o1 = nil; 42 while (o1 = [et1 nextObject]) { 43 NSLog(@"%@", o1); 44 } 45 // 通过迭代器遍历数组 反序 46 NSEnumerator *et2 = [arr1 reverseObjectEnumerator]; 47 id o2 = nil; 48 while (o2 = [et2 nextObject]) { 49 NSLog(@"%@", o2); 50 } 51 52 53 // 派生出新的数组 54 NSArray *array1 = [NSArray arrayWithObjects:@"1", @"2", nil]; 55 NSArray *array2 = [array1 arrayByAddingObject:@"3"]; 56 NSArray *array3 = [array1 arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4", @"5", nil]]; 57 NSLog(@"%@", array1); // (1,2) 58 NSLog(@"%@", array2); // (1,2,3) 59 NSLog(@"%@", array3); // (1,2,4,5) 60 NSArray *array4 = [array3 subarrayWithRange:NSMakeRange(1, 2)]; 61 NSLog(@"%@", array4); // (2,4) 62 63 // 利用分隔符将数组元素拼接成一个字符串 64 NSString *str = [array3 componentsJoinedByString:@"-"]; //1-2-4-5 65 NSLog(@"%@", str); 66 67 // 将数组写入文件(xml格式),生成的文件见下图 68 [array3 writeToFile:@"/Users/Lane/Desktop/array.xml" atomically:YES]; 69 // 从文件中读取数组,格式见下图 70 NSArray *array5 = [NSArray arrayWithContentsOfFile:@"/Users/Lane/Desktop/array.xml"]; 71 NSLog(@"%@", array5); 72 73 // 通过selector进行数组排序 74 NSArray *array6 = [NSArray arrayWithObjects:@"4", @"2", @"5", @"3", nil]; 75 // 指定元素的比较方法:NSString的compare:方法 76 NSArray *array7 = [array6 sortedArrayUsingSelector:@selector(compare:)]; 77 NSLog(@"%@", array7); // (2,3,4,5) 78 // 如果是其他类型,则要自定义比较方法 79 // 例如Student有fistName和lastName两个成员变量,则比较方法如下: 80 /* 81 - (NSComparisonResult)compare:(Student *)otherStudent { 82 // 先比较fistName 83 NSComparisonResult result = [self.fistName compare:otherStudent.fistName]; 84 if (result==NSOrderedSame) { // 如果fistName相同,则比较lastName 85 result = [self.lastName compare:otherStudent.lastName]; 86 } 87 return result; 88 } 89 */ 90 // 通过Block进行数组排序 91 NSArray *array8 = [array6 sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { 92 return [obj1 compare:obj2]; 93 }]; 94 NSLog(@"%@", array8); // (2,3,4,5) 95 // 通过排序描述器进行数组排序 96 /* 97 NSSortDescriptor *bookNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"book.name" ascending:YES]; 98 NSSortDescriptor *fistNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"fistName" ascending:YES]; 99 NSSortDescriptor *lastNameDesc = [NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:YES]; 100 // 先按书名排序,再按fistName排序,最后按lastName排序 101 [array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:bookNameDesc, fistNameDesc, lastNameDesc, nil]]; 102 */ 103 104 // 数组的内存管理 105 NSObject *obj1 = [[NSObject alloc] init]; 106 NSObject *obj2 = [[NSObject alloc] init]; 107 NSObject *obj3 = [[NSObject alloc] init]; 108 NSLog(@"obj1.retainCount=%zi", [obj1 retainCount]); //obj1.retainCount=1 109 NSLog(@"obj2.retainCount=%zi", [obj2 retainCount]); //obj2.retainCount=1 110 NSLog(@"obj3.retainCount=%zi", [obj3 retainCount]); //obj3.retainCount=1 111 // 把一个对象加到NSArray时,该对象的引用计数会加1 112 NSArray *arr2 = [[NSArray alloc] initWithObjects:obj1, obj2, obj3, nil]; 113 NSLog(@"obj1.retainCount=%zi", [obj1 retainCount]); //obj1.retainCount=2 114 NSLog(@"obj2.retainCount=%zi", [obj2 retainCount]); //obj2.retainCount=2 115 NSLog(@"obj3.retainCount=%zi", [obj3 retainCount]); //obj3.retainCount=2 116 // 数组被销毁的时候会对所有元素都进行release 117 [arr2 release]; 118 NSLog(@"obj1.retainCount=%zi", [obj1 retainCount]); //obj1.retainCount=1 119 NSLog(@"obj2.retainCount=%zi", [obj2 retainCount]); //obj2.retainCount=1 120 NSLog(@"obj3.retainCount=%zi", [obj3 retainCount]); //obj3.retainCount=1 121 [obj1 release]; [obj2 release]; [obj3 release]; 122 123 124 125 } 126 return 0; 127 }
NSArray生成的文件: