NSArray
NSArray
1、创建数组:
NSArray *array = [NSArray array]; //通过array 这个静态方法可以快速创建一个空的数组。 array = [NSArray arrayWithObject:@"123"]; //arrayWithObject: 静态方法 创建有1个元素的数组。 array = [NSArray arrayWithObjects:@"a", @"b", @"c", nil]; //arrayWithObjects: 静态方法 创建有多个元素的数组。 int count = [array count]; //等价于: count = array.count; count方法用于获得数组元素个数。
2、数组的简单使用:
NSObject *obj = [[NSObject alloc] init]; NSArray *array = [NSArray arrayWithObjects:@"a", @"b", @"c" , obj, nil]; //任何OC对象都可以放入OC数组中,如:obj。 if ([array containsObject:@"a"]) { //containsObject: 方法用于判断array数组中是否包含了元素@"a",返回值为BOOL类型。 NSLog(@"包含了字符串a"); } NSString *last = [array lastObject]; //lastObject 方法用于取出数组array中最后一个元素。 NSString *str = [array objectAtIndex:1]; //objectAtIndex: 方法用于取出数组中索引所对应的元素。 int index = [array indexOfObject:@"c"]; //indexOfObject: 方法用于得到数组中元素@"c"所对应的索引值(脚标)。 -(NSUInteger)indexOfObject(id)anObject inRange:(NSRange)range //这个方法是在range范围内查找指定元素的位置。 -(BOOL)isEqualToArray(NSArray *)otherArray //这个方法用来比较两个集合内容是否相同。 -(id)firstObjectCommonWithArray(NSArray *)otherArray //这个方法用来返回两个集合中第一个相同的对象元素。
3、数组的内存管理:
Student *stu1 = [[Student alloc] init]; Student *stu2 = [[Student alloc] init]; Student *stu3 = [[Student alloc] init]; NSLog(@"stu1:%zi", [stu1 retainCount]); //retainCount 方法用来获得stu1这个对象的内存计数器的值。 NSArray *array = [[NSArray alloc] initWithObjects:stu1, stu2, stu3, nil]; //initWithObjects: 方法用来把对象stu1, stu2, stu3塞进数组中,当把一个对象塞进数组中时,这个对象的计数器会加1,也就是说数组会对它做一次retain操作。 [stu1 release]; [stu2 release]; [stu3 release]; [array release]; // 数组被销毁的时候,会对内部的所有元素都做一次release操作。
4、给数组里面的元素发送消息:
Student *stu1 = [[Student alloc] init]; Student *stu2 = [[Student alloc] init]; Student *stu3 = [[Student alloc] init]; NSArray *array = [NSArray arrayWithObjects:stu1, stu2, stu3, nil]; //arrayWithObjects: 方法用来把对象stu1, stu2, stu3塞进数组中。 [array makeObjectsPerformSelector:@selector(test)]; //makeObjectsPerformSelector:@selector() 方法让数组array里面的所有对象都调用test方法。 [array makeObjectsPerformSelector:@selector(test2:) withObject:@"123"]; //makeObjectsPerformSelector:@selector()withObject: 方法让数组array里面的所有对象都调用test2:方法并传递一个参数@"123";此方法只支持传一个参数;注:test2:是有有参数的方法。
5、遍历数组:
NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; int count = array.count;//这样写可以让代码效率更高,count方法可以只调用一次。 for (int i = 0; i<count; i++) { // id类型 等价与 void * id obj = [array objectAtIndex:i]; NSLog(@"%i-%@", i, obj); } //快速遍历:for-in 语法 NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; int i =0; for (id obj in array) { //快速遍历,把array中的元素遍历一遍赋值给obj。 NSLog(@"%i-%@", i, obj);//i作为array中的角标。 i++; } //使用Block遍历数组(系统推荐使用): NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{ NSLog(@"%i-%@", idx, obj); //enumerateObjectsUsingBlock: 方法是使用Block方式遍历一个数组array,每遍历到一个数组中的元素就会调用一次Block;obj、idx、*stop为三个参数,obj为当前遍历的数组中元素、idx为当前遍历数组中的元素索引、*stop为是否继续遍历数组的条件判断,当*stop = YES;时遍历停止。 if (idx == 1) {// 如果索引为1,就停止遍历 *stop = YES; // 利用指针修改外面BOOL变量的值 } }]; //通过迭代器遍历数组: NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; NSEnumerator *enumerator = [array objectEnumerator]; //获取数组的迭代器 NSEnumerator *enumerator = [array reverseObjectEnumerator]; //获取数组的反序迭代器(从尾部开始遍历元素) NSArray *array2 = [enumerator allObjects]; // allObjects 方法是只能取出没有被遍历过的元素对象。 NSLog(@"array2:%@", array2); id obj = nil; while (obj = [enumerator nextObject]) { //nextObject 方法用于获取下一个需要遍历的元素。 NSLog(@"obj=%@", obj); }
6、派生出新的数组:
NSArray *array = [NSArray arrayWithObjects:@"1", @"2", nil]; NSArray *array2 = [array arrayByAddingObject:@"3"]; //arrayByAddingObject: 方法用于在原来的数组array基础上添加新的对象(元素)生成一个新的数组array2。 NSArray *array3 = [array arrayByAddingObjectsFromArray:[NSArray arrayWithObjects:@"4", @"5", nil]]; //arrayByAddingObjectsFromArray: 方法 用于在原来数组array基础上添加一个新的数组[NSArray arrayWithObjects:@"4", @"5", nil]后生成一个新数组array3。 NSArray *array4 = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; NSRange range = NSMakeRange(1, 2); NSArray *array5 = [array4 subarrayWithRange:range]; //subarrayWithRange: 方法按照指定范围range来截取数组array4中的元素形成新的数组。 NSLog(@"array5:%@", array5); //注:array、array2、array3、array4、array5 五个数组皆为不可变数组,前后并没有变化仍是原来的数组。
7、数组的其他用法:
NSArray *array = [NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; NSString *str = [array componentsJoinedByString:@"-"]; //componentsJoinedByString: 方法 是利用分隔符-拼接数组array中所有的元素形成字符串@”1-2-3-4”。 NSString *path = @"/Users/apple/Desktop/array.xml";//字符串的形式指定一个路径。 [array writeToFile:path atomically:YES];//writeToFile:(NSString *) atomically:(BOOL) 方法是将一个数组array按照路径path写入文件(生成的是一个xml文件),atomically:YES代表要进行原子性操作。 path = @"/Users/apple/Desktop/array.txt"; NSArray *array2 = [NSArray arrayWithContentsOfFile:path]; //arrayWithContentsOfFile: 方法是从指定路径path文件中(文件有严格的格式要求XML格式)读取内容形成一个数组。
NSMutableArray
NSMutableArray *array = [NSMutableArray arrayWithObject:@"1"];//NSMutableArray 动态数组类型。 [array addObject:@"2"];// 添加元素 [array addObject:@"3"]; [array removeObject:@"2"];//removeObject: 方法用于移除数组array中指定的元素@"2"。 [array removeLastObject];//removeLastObject 方法用于移除数组array中最后一个元素。 [array removeAllObjects];//removeAllObjects 方法用于移除数组array中的所有元素。 NSMutableArray *models = [NSMutableArray arrayWithCapacity:20]; // arrayWithCapacity 方法用于给数组分配容量。 -(void)setArray:(NSArray *)otherArray //设置集合元素。 -(void)addObjectsFromArray:(NSArray *)otherArray //添加otherArray数组的全部元素到集合中。 -(void)insertObject:(id)anObject atIndex:(NSUInteger)index //在index位置插入一个元素。 -(void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes //在indexes指定的位置分别插入objects数组中的元素。 -(void)removeObjectAtIndex:(NSUInteger)index //删除index位置的元素。 -(void)removeObjectsAtIndexes:(NSIndexSet *)indexes //删除indexes位置的所有元素。 -(void)removeObject:(id)anObject inRange:(NSRange)range //在range范围内查找特定的元素进行删除。 -(void)removeObjectsInArray:(NSArray *)otherArray //删除同时存在于otherArray和当前集合中的所有元素。 -(void)removeObjectsInRange:(NSRange)range //删除range范围内的所有元素。 -(void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject //用anObject替换index位置对应的元素。 -(void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects //用objects数组中的元素分别替换indexes对应位置的元素。 -(void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange //用otherArray数组中otherRange范围内的元素替换当前集合range范围内的元素。 -(void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray //用otherArray数组中的元素替换当前集合range范围内的元素。 -(void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2 //交换idx1和idx2位置的元素。 //下面三个排序方法的用法参考NSArray的排序。 -(void)sortUsingDescriptors:(NSArray *)sortDescriptors; -(void)sortUsingComparator:(NSComparator)cmptr; -(void)sortUsingSelector:(SEL)comparator; //例下: NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"3", @"2", nil]; [array sortUsingSelector:@selector(compare:)]; NSLog(@"%@", array);
注:OC中数组和字典只能存储OC对象不能存放基本数据类型。