数组:NSArray 和 NSMutableArray

本文详细介绍了Objective-C中的数组概念,包括不可变数组(NSArray)和可变数组(NSMutableArray)的创建与使用方法。探讨了数组的初始化、操作、排序等关键特性。

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

数组:
数组是一个只存储任意类型的对象(指针),不可以存储普通类型数据。
数组是有序的,数组只有进过初始化后才可以使用。


不可变数组NSArray
不可变数组一经创建后,就不可以改变其中的元素,但是可以重新排序。


1.创建不可变数组:
// 1.直接赋值
   
NSArray *array1 = @[@"sds",@"aaa"];
   
   
// 2.copy 不可变数组可以用copy,也可以用mutableCopy。 但是可变数组只可以使用mutableCopy
   
NSArray *array2 = array1.copy;
   
   
// 3.直接创建
   
NSArray *array3 = [NSArray array];
   
   
// 4.利用一个数组来创建
   
NSArray *array4 = [NSArray arrayWithArray:array2];
   
   
// 5.创建数组接收本地文件内容,如Plist文件 (内容最外层必须为数组)
   
NSArray *array5 = [NSArray arrayWithContentsOfFile:@"/Users/qiancheng/Desktop/笔记/OC/Array MutableArray/Array MutableArray/Property List.plist"];
   
   
// 6.创建数组接收网络文件内容 注意,使用url 网络路径加“http://” 本地路径加“file://”
   
NSArray *array6 = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:@"file:///Users/qiancheng/Desktop/笔记/OC/Array MutableArray/Array MutableArray/Property List.plist"]];
   
   
// 7.另一种直接创建的方法
   
NSArray *array7 = [NSArray arrayWithObject:@"sdsd"];
   
// 注意使用arrayWithObjects 创建数组,一定不要忘了最后加“nil” 但是数组其实是不可以存储“nil”对象
   
NSArray *array8 = [NSArray arrayWithObjects:@"sdsd",@"ffss", nil];

 

2.不可变数组的一些使用方法:
 
   
// 判断一个数组中有没有这个对象
   
NSArray *array1 = @[@"ud",@"333"];
   
BOOL a = [array1 containsObject:@"33"];
   
NSLog(@"%@",a == 1 ? @"" : @"没有");
   
   
// 追加一个元素,生成一个新的数组
   
NSArray *array2 = [array1 arrayByAddingObject:@"8989"];
   
   
// 追加一个数组,生成一个新的数组
   
NSArray *array3 = [array2 arrayByAddingObjectsFromArray:array2];
   
NSLog(@"%@",array3);
   
    // 数组的四种遍历方法
    // 第一种
   
for(int i = 0;i < array3.count; i ++) {
       
NSLog(@"%@",array3[i]);
    }
   
   
// 第二种 快速遍历  for...in 根据存储对象类型来
   
for(NSString *str in array3) {
       
NSLog(@"%@",str);
    }
   
   
// 第三种 枚举器遍历 通过一个数组创建一个枚举器对象,把数组里的元素放在了枚举器里
   
NSEnumerator *en = [array3 objectEnumerator];
   
id obj;
   
while (obj = [en nextObject]) {
       
NSLog(@"%@",obj);
    }
  
 // 第四种 逆序枚举遍历 可以修改数组里面的元素
   
NSEnumerator *enumer = [array3 reverseObjectEnumerator];
   
id obj1;
   
while (obj1 = [enumer nextObject]) {
       
static int i = 0;
        i ++ ;
       
if (i == 2) {
            obj1 =
@"2222";
        }
        NSLog(@"%@",obj1);
    }

    // 看某个元素索引 返回找到的第一个元素的索引
   
NSInteger b = [array3 indexOfObject:@"333"];
   
NSLog(@"%ld",b);
   
   
// 在给定的范围里找 如果未找到,可能会返回一个随机大的数值
   
NSInteger c = [array3 indexOfObject:@"333" inRange:NSMakeRange(0, 2)];
   
NSLog(@"%ld",c);
   
   
//将一个字符串按一种格式切割成多个字符串,存储在数组内 如果刚好这个格式符前面或后面无字符,那么会切割出一个空字符存储在数组中
   
NSString *str = @"da$dfds$sdsdsd$dfdfdf$";
   
NSArray *array4 = [str componentsSeparatedByString:@"$"];
   
NSLog(@"%@",array4);
   
   
//NSCharacterSet是一个字符集和,把", "放在集合里,通过这个集合切割字符串、如果刚好这个集合切割字符串前面、后面或者集合之间无字符,那么会切割出一个空字符存储在数组中
   
NSArray *array5 = [str componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"$d"]];
   
NSLog(@"%@",array5);
   
   
//把数组里的元素(字符串)按一种格式拼接起来 格式符可以为空 注意,如果格式符不为空,那么拼接的格式为格式符、元素
   
NSString *str1 = [array5 componentsJoinedByString:@""];
   
NSLog(@"%@",str1);
   
// 数组排序 (不可变数组比较有个返回值,为NSArray类型。可变数组没有返回值)
   
NSArray *arr = @[@"12",@"6",@"56",@"18"];
    arr = [arr
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
       
return [obj1 intValue] < [obj2 intValue];
    }];
    NSLog(@"%@",arr);
 
// @Selector指示的消息发送给数组中的每个元素。
      - (void)makeObjectsPerformSelector:(SEL)aSelector;

 //  makeObjectsPerformSelector:类似于NSNotifation机制,并发的执行同一件事,不能像for循环那样区别对待 所以参数 argument 必须是非基本类型 ,如果要是用基本类型 请转换程 NSNumber 或者NSValue
   - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;
如果一个数组objArr中存储了一组有hide属性的对象,需要将数组里所有对象的hide全部赋值为真,就可以这么写:
      [objArr makeObjectsPerformSelector:@selector(setHidden:) withObject:@YES]; 


可变数组NSMutableString:
可变数组可以修改其中的元素。可变数组继承于不可变数组,所以不可变数组的方法,可变数组都可以使用。
 

1.可变数组的创建:
 // 1.按多少堆空间来创建
   
NSMutableArray *mutableArray1 = [NSMutableArray arrayWithCapacity:0];
   
    // 2.使用mutableCopy来创建。不可以使用copy,因为copy的使用是让编译器将mutableArray2认为为不可变数组,那么在执行不可变数组的方法时会因为找不到而报错。
    NSMutableArray *mutableArray2 = @[].mutableCopy;
    [mutableArray2
arrayByAddingObject:@"sdsds"];

  

2.可变数组的使用:
NSMutableArray * array1 = [[NSMutableArray alloc]initWithCapacity:20];
   
// 1.添加方法
    [array1
addObject:@"dssd"];
    [array1
addObjectsFromArray:@[@"sdsd",@"sdsds",@"ffffff"]];
   
   
// 2.删除方法
    [array1
removeObject:@"c"];
    [array1
removeLastObject];//删除最后一个元素
    [array1
removeObject:@"A" inRange:NSMakeRange(0, 1)];//根据范围内删除
    [array1
removeObjectAtIndex:1];//根据索引删除
    [array1
removeAllObjects];//删除所有元素

   
// 根据插入元素
    [array1
insertObject:@"sdsd" atIndex:0];
    [array1
insertObject:@"sssss" atIndex:0];
   
   
//替换
    [array1
replaceObjectAtIndex:0 withObject:@"w"];//将索引位置的元素替换
   
NSLog(@"%@",array1);
   
   
//交换元素位置
    [array1
exchangeObjectAtIndex:1 withObjectAtIndex:0];
   
NSLog(@"%@",array1);
   
//  比较数组中元素的大小    (首先设计一个 Dog )
   
NSMutableArray * array = [[NSMutableArray alloc]init];
   
int i = 0;
   
while (i++ < 5) {
       
Dog * dog = [[Dog alloc]initWithAge:arc4random()%10];
        [array
addObject:dog];
    }
    [array sortUsingSelector:@selector(olderThanAge:)];
   
//sortUsingSelector 这是一个排序方法;已经实现了, //但是需要我们提供一个准则(就是一个函数)这个准则是(升序)左边大于右边进行交换 或者是(降序)左边小于右边进行交换 //数组的元素是哪个类?那么这个准则就写在哪个类中
   
//这就是一个准则 升序 左边大于右边进行交换
   
for (Dog *dog in array) {
       
NSLog(@"%i",dog.age);
    }

#import "Dog.h"

@implementation Dog

- (
instancetype)initWithAge:(int)age {
   
if (self = [super init]) {
       
_age = age;
    }
   
return self;
}

- (
BOOL)olderThanAge:(Dog *)_dog {
   
return [self age] > [_dog age];
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值