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生成的文件:

posted on 2013-04-30 03:07  蓝易  阅读(181)  评论(0编辑  收藏  举报