iOS学习笔记20131126-NSArray

本文详细介绍了 Objective-C 中 NSArray 和 NSMutableArray 的创建、删除、修改、查询、遍历、排序、比较以及文件读写等核心用法,通过实例展示了如何在实际开发中灵活运用这些数组操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数组简介

NSArray:用来存储有序数组,它是不可变的,也不能存储C语言中的基本数据类型(int、float、double、enum、struct),也不能存nil,如果需要使用基本数据类型,需要先转成Objective-c中的对象。如NSNumber。另外,数组的最后一个元素一定是nil,表示结束。

二、创建数组

  
  1. //1、array
  2. NSArray * arr = [NSArray array]; //因为是类方法,所以无需管理内存
  3. //2、arrayWithArray:
  4. NSArray * arr1 = [NSArray arrayWithArray:arr];
  5. //3、arrayWithObject:
  6. NSArray * arr3 = [NSArray arrayWithObject:@"Apple"];
  7. //4、arrayWithObjects:
  8. NSArray * arr4 = [NSArray arrayWithObjects:@"Apple", @"Android", nil];
  9. //5、arrayWithObjects:count:
  10. NSString * str5[3] = {@"aaa", @"BBB", @"CCC"};
  11. NSArray * arr5 = [NSArray arrayWithObjects:str5 count:2]; //获取数量
  12. //6、init
  13. NSArray * arr6 = [[NSArray alloc] init];
  14. arr6 = @[@"LLL", @"IIII", @"BBBB"];
  15. [arr6 release]; //对象需要进行内存释放
  16. //7、initWithArray:
  17. NSArray * arr7 = [[NSArray alloc] initWithArray:arr6];
  18. [arr7 release];
  19. //8、initWithObjects:
  20. NSArray * arr8 = [[NSArray alloc] initWithObjects:arr6, arr5, nil];
  21. //9、initWithObjects:count:
  22. NSArray * arr9 = [[NSArray alloc] initWithObjects:str5 count:1];
  23. [arr9 release];
  24. //10、arrayWithCapacity 初始化可变数组对象的长度
  25. NSMutableArray *array10 = [NSMutableArray arrayWithCapacity:10];
  26. //11、initWithCapacity
  27. NSMutableArray * array101 = [[NSMutableArray alloc] initWithCapacity:10];

*自面量(@) < @[<#objects, ...#>] >

可以使用下面的方式创建数组,并且无需担心内存

  
  1. NSArray *arr2 = @[@"Apple", @"DELL", @"Lenovo"];

三、数组删除(NSMutableArray)

  
  1. //1.removeAllObjects 删除数组中所有的Objects
  2. NSMutableArray *list = [[NSMutableArray alloc] init];
  3. Person *car = [[Person alloc] init];
  4. car.price = 10;
  5. car.color = 1;
  6. Person *car1 = [[Person alloc] init];
  7. car1.price = 120;
  8. car1.color = 12;
  9. [list addObject:car];
  10. [list addObject:car1];
  11. NSLog(@"%@", list);
  12. [list removeAllObjects]; // Crash here
  13. NSLog(@"%@", list);
  14.  
  15. //2、removeLastObject 删除最后一个object
  16. [list removeLastObject];
  17. NSLog(@"%@", list);
  18.  
  19. //3、removeObject: //删除指定Object
  20. [list removeObject:car];
  21. NSLog(@"%@", list);
  22.  
  23. //4、removeObject:inRange: //在指定范围删除car1
  24. NSRange range = {1, 1};
  25. [list removeObject:car1 inRange:range];
  26. NSLog(@"%@", list);
  27.  
  28. //5、removeObjectAtIndex: //删除指定下标的object
  29. [list removeObjectAtIndex:3];
  30.  
  31. //6、removeObjectsInArray: //删除在数组中出现的Object
  32. NSArray * arr00 = @[car];
  33. [list removeObjectsInArray:arr00];
  34. NSLog(@"%@", list);
  35.  
  36. //7、removeObjectsInRange: //删除指定范围的Object
  37. [list removeObjectsInRange:range];
  38. NSLog(@"%@", list);
  39. [list release];

四、数组修改(NSMutableArray)

  
  1. //1. arrayByAddingObject 向数组添加值返回新的数组
  2. NSArray * array = @[@"AAA", @"BBB", @"CCC"];
  3. NSString * str11 = @"bb989";
  4. NSLog(@"%@", [array arrayByAddingObject:str11]);
  5.  
  6. //2.arrayByAddingObjectsFromArray 组合两个数组
  7.  
  8. NSLog(@"%@", [array arrayByAddingObjectsFromArray:array]);
  9.  
  10. //3.componentsJoinedByString 数组切成字符串
  11. NSLog(@"%@", [array componentsJoinedByString:@","]);
  12.  
  13. //4. addObject 向数组添加对象
  14. NSMutableArray * array4 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", nil];
  15. [array4 addObject:@"CCC"];
  16. NSLog(@"%@", array4);
  17.  
  18. //5. addObjectsFromArray 向数组中添加格式化数组
  19. [array4 addObjectsFromArray:array];
  20. NSLog(@"%@", array4);
  21.  
  22. //6. insertObject:atIndex 在指定下标添加对象
  23. [array4 insertObject:@"OOO" atIndex:1];
  24. NSLog(@"%@", array4);
  25.  
  26. //7. replaceObjectAtIndex:withObject 替换指定下标的元素
  27. [array4 replaceObjectAtIndex:1 withObject:@"ppp"];
  28. NSLog(@"%@", array4);
  29.  
  30. //8.setArray 替换原数组
  31. NSArray * array8 = @[@"A", @"B", @"C"];
  32. [array4 setArray:array8];
  33. NSLog(@"%@", array4);
  34.  
  35. //9.exchangeObjectAtIndex:withObjectAtIndex 交换指定下标的元素
  36. [array4 exchangeObjectAtIndex:1 withObjectAtIndex:2];
  37. NSLog(@"%@", array4);

五、数组查询

  
  1. NSString * str = @"CCC";
  2. NSArray * array = @[str];
  3.  
  4. //1.containsObject 是否包含指定对象
  5. if ([array containsObject:str]) {
  6. NSLog(@"array 包含 str");
  7. }
  8.  
  9. //2.count 数组中所含元素个数,不包括 nil
  10. NSArray * array2 = [NSArray arrayWithObjects:@"AAA", @"BBBB", nil];
  11. NSLog(@"count = %zi", array2.count);
  12.  
  13. //3.getObjects:range:
  14. //4.firstObject 返回两个数组中第一个相同的对象元素
  15. NSMutableArray * array4 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", nil];
  16. NSLog(@"%@", [array4 firstObjectCommonWithArray:array4]);
  17.  
  18. //5.lastObject 返回数组最后一个元素
  19. NSMutableArray * array5 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", @"ccc",nil];
  20. NSLog(@"%@", [array5 lastObject]);
  21.  
  22. //6.objectAtIndex 返回指定索引的元素
  23. NSLog(@"%@", [array5 objectAtIndex:1]);
  24.  
  25. //7.indexOfObject 返回指定对象的下标
  26. NSLog(@"%li", [array5 indexOfObject:@"bbbb"]);
  27.  
  28. //8.indexOfObject:inRange 返回范围内指定对象的下标
  29. NSRange range = NSMakeRange(0, 3);
  30. NSLog(@"%li", [array5 indexOfObject:@"ccc" inRange:range]);
  31.  
  32. //9.makeObjectsPerformSelector 给元素发送消息,让数组中的对象全部执行某一方法
  33. //创建两个对象,并且person类有一个play方法。
  34. Person * p1 = [[Person alloc] init];
  35. Person * p2 = [[Person alloc] init];
  36.  
  37. NSArray * array3 = [[NSArray alloc] initWithObjects:p1, p2, nil];
  38.  
  39. [array3 makeObjectsPerformSelector:@selector(play)];
  40. //2013-10-18 16:33:08.366 objective-c——NSArray[11732:303] I am a player
  41. //2013-10-18 16:33:08.367 objective-c——NSArray[11732:303] I am a player
  42.  
  43. [p1 release];
  44. [p2 release];
  45. [array3 release];
  46. //当然还可以使用下面的方法传递参数
  47. //- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
  48.  
  49. //10.firstObjectCommonWithArray 返回两个集合中第一个相同的对象元素
  50. NSLog(@"%@", [array5 firstObjectCommonWithArray:array5]);
  51. //2013-10-18 16:27:03.083 objective-c——NSArray[11672:303] Apple
  52.  
  53. //11.subarrayWithRange: 截取范围内的数组元素
  54. NSLog(@"%@", [array5 subarrayWithRange:range]);

六、数组排序

  
  1. //1.reverseObjectEnumerator 数组倒序输出
  2. NSArray *array8 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
  3. for (NSString * str in [array8 reverseObjectEnumerator]) {
  4. NSLog(@"%@", str);
  5. }
  6.  
  7. //2.sortedArrayUsingFunction:context 使用自定义方法排序
  8. // [array8 sortedArrayUsingSelector:< #(SEL)#>];
  9. //3.sortedArrayUsingDescriptors
  10. // [array8 sortedArrayUsingSelector:< #(SEL)#>]
  11. //4.sortedArrayUsingSelector
  12. //5.sortUsingDescriptors
  13. //6.sortUsingFunction:context
  14. //7.sortUsingSelector

七、数组比较

  
  1. //1. isEqualToArray 比较两个数组元素是否相等
  2. if ([array5 isEqualToArray:array5]) {
  3. NSLog(@"array5 equal array5");
  4. }

八、数组遍历

1 for循环遍历

  
  1. NSUInteger count = array2.count;
  2. for (int i = 0; i < count; i ++) {
  3. NSLog(@"%@", [array2 objectAtIndex:i]);
  4. }

2 for in 遍历

  
  1. for (id obj in array2) {
  2. NSLog(@"%@", obj);
  3. }

3 Block 遍历

  
  1. [array2 enumerateObjectsUsingBlock:
  2. ^(id obj, NSUInteger idx, BOOL *stop) {
  3. NSLog(@"%zi = %@", idx, obj);
  4. //可以使用 *stop = YES 停止遍历
  5. }];

4 迭代器遍历

  
  1. //创建迭代器(正序)
  2. NSEnumerator *enumerator = [array2 objectEnumerator];
  3. //创建迭代器(倒序)
  4.  
  5. //NSEnumerator *enumerator = [array2 reverseObjectEnumerator];
  6. //nextObject 取得下个元素
  7. id obj = nil;
  8. while(obj = [enumerator nextObject]){
  9. NSLog(@"%@", obj);
  10. }
  11. //返回迭代器的所有元素,如果放到遍历后面则输出空。
  12. //[enumerator allObjects];

九、NSArray 文件读写

1 writeToFile写文件,会保存为XML格式的文件。

  
  1. NSArray * array = @[@"AAA", @"BBB"];
  2. NSString * path = @"/Users/simman/NSarray.xml";
  3. [array writeToFile:path atomically:YES];

2 arrayWithContentsOfFile:path 读文件(规定格式(如:xml)转数组)

  
  1. NSArray * array1 = [NSArray arrayWithContentsOfFile:path];
  2. NSLog(@"%@", array1);

十、数组的内存管理

要说明数组的内存管理,我们可以使用类来做演示。
1 创建Person类

  
  1. //创建Person类,并复写dealloc方法,使之能打印出当前释放的对象
  2. - (void)dealloc {
  3. NSLog(@"%@ is released", self);
  4. [super dealloc];
  5. }

2 创建三个Person的对象

  
  1. Person *p1 = [[Person alloc] init];
  2. Person *p2 = [[Person alloc] init];
  3. Person *p3 = [[Person alloc] init];

3 把三个对象放进数组 array 里

  
  1. NSArray * array = [[NSArray alloc] initWithObjects:p1, p2, p3, nil];

4 打印p1 p2 p3的计数器

  
  1. NSLog(@"p1_RetainCount = %zi, p1.retainCount);
  2. NSLog(@"p2_RetainCount = %zi", p2.retainCount);
  3. NSLog(@"p3_RetainCount = %zi", p3.retainCount);
 控制台输出:
2013-10-18 16:13:19.012 objective-c——NSArray[11579:303] p1_RetainCount = 2
2013-10-18 16:13:19.014 objective-c——NSArray[11579:303] p2_RetainCount = 2
2013-10-18 16:13:19.016 objective-c——NSArray[11579:303] p3_RetainCount = 2

5 释放p1 p2 p3对象

  
  1. [p1 release];
  2. [p2 release];
  3. [p3 release];

6 释放array数组

  
  1. [array release];
2013-10-18 16:01:01.111 objective-c——NSArray[11543:303]  is released
2013-10-18 16:01:01.112 objective-c——NSArray[11543:303]  is released
2013-10-18 16:01:01.112 objective-c——NSArray[11543:303]  is released

7 总结
当把对象放进数组中,该对象将执行retain,计数器将 + 1
当数组 release 的时候,会对所有数组元素做 release 操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值