NSArray

作者: Silence_xl | 来源:发表于2021-05-15 16:29 被阅读0次

为什么NSArray和NSDictionary中不能存放int、float、bool等基本类型?

因为NSArray和NSDictionary中只能存放对象。基本类型不是对象。那为什么NSArray和NSDictionary中只能存放对象呢?

因为Objc的对象实际是一个指针,所以从指针的这个角度来看的话,数组和字典中存放的每一项都是等长的。这样处理比如length,get、add等操作的时候就非常简单了。

用了c语言的数组以后,就会觉得Objc的NSArray实在太方便了。就是因为上面的这一点。

//一、数组简介

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

//二、创建数组

//1、array
NSArray *arr = [NSArray array];//因为是类方法,所以无需管理内存
//2、arrayWithArray:
NSArray *arr1 = [NSArray arrayWithArray:arr];
//可以使用下面的方式创建数组,并且无需担心内存
NSArray *arr2 = @[@"Apple", @"DELL", @"Lenovo"];
//3、arrayWithObject:
NSArray *arr3 = [NSArray arrayWithObject:@"Apple"];
//4、arrayWithObjects:
NSArray *arr4 = [NSArray arrayWithObjects:@"Apple", @"Android", nil];
//5、arrayWithObjects:count:
NSString *str5[3] = {@"aaa", @"BBB", @"CCC"};
NSArray *arr5 = [NSArray arrayWithObjects:str5 count:2]; //获取数量
//6、init
NSArray *arr6 = [[NSArray alloc] init];
arr6 = @[@"LLL", @"IIII", @"BBBB"];
//7、initWithArray:
NSArray *arr7 = [[NSArray alloc] initWithArray:arr6];
//8、initWithObjects:
NSArray *arr8 = [[NSArray alloc] initWithObjects:arr6, arr5, nil];
//9、initWithObjects:count:
NSArray *arr9 = [[NSArray alloc] initWithObjects:str5 count:1];
//10、arrayWithCapacity 初始化可变数组对象的长度
NSMutableArray *array10 = [NSMutableArray arrayWithCapacity:10];
//11、initWithCapacity
NSMutableArray * array11 = [[NSMutableArray alloc] initWithCapacity:10];

//三、数组删除(NSMutableArray)

//1.removeAllObjects 删除数组中所有的Objects
NSMutableArray *list = [[NSMutableArray alloc] init];
NSObject *car = [[NSObject alloc] init];
NSObject *car1 = [[NSObject alloc] init];
[list addObject:car];
[list addObject:car1];
NSLog(@"%@", list);
[list removeAllObjects]; // Crash here
NSLog(@"%@", list);

//2、removeLastObject 删除最后一个object
[list removeLastObject];
NSLog(@"%@", list);

//3、removeObject: //删除指定Object
[list removeObject:car];
NSLog(@"%@", list);

//4、removeObject:inRange: //在指定范围删除car1
NSRange range = {1, 1};
[list removeObject:car1 inRange:range];
NSLog(@"%@", list);

//5、removeObjectAtIndex:  //删除指定下标的object
[list removeObjectAtIndex:3];

//6、removeObjectsInArray: //删除在数组中出现的Object
NSArray *arr00 = @[car];
[list removeObjectsInArray:arr00];
NSLog(@"%@", list);

//7、removeObjectsInRange: //删除指定范围的Object
[list removeObjectsInRange:range];
NSLog(@"%@", list);

//四、数组修改(NSMutableArray)

//1. arrayByAddingObject 向数组添加值返回新的数组
NSArray *array = @[@"AAA", @"BBB", @"CCC"];
NSString * str11 = @"bb989";
NSLog(@"%@", [array arrayByAddingObject:str11]);

//2.arrayByAddingObjectsFromArray 组合两个数组
NSLog(@"%@", [array arrayByAddingObjectsFromArray:array]);

//3.componentsJoinedByString 数组转成字符串
NSLog(@"%@", [array componentsJoinedByString:@","]);

//4. addObject 向数组添加对象
NSMutableArray *array4 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", nil];
[array4 addObject:@"CCC"];
NSLog(@"%@", array4);

//5. addObjectsFromArray 向数组中添加格式化数组
[array4 addObjectsFromArray:array];
NSLog(@"%@", array4);

//6. insertObject:atIndex 在指定下标添加对象
[array4 insertObject:@"OOO" atIndex:1];
NSLog(@"%@", array4);

//7. replaceObjectAtIndex:withObject 替换指定下标的元素
[array4 replaceObjectAtIndex:1 withObject:@"ppp"];
NSLog(@"%@", array4);

//8.setArray 替换原数组
NSArray *array8 = @[@"A", @"B", @"C"];
[array4 setArray:array8];
NSLog(@"%@", array4);

//9.exchangeObjectAtIndex:withObjectAtIndex 交换指定下标的元素
[array4 exchangeObjectAtIndex:0 withObjectAtIndex:1];
NSLog(@"%@", array4);

//五、数组查询

NSString *str = @"CCC";
NSArray *array = @[str];
//1.containsObject   是否包含指定对象
if ([array containsObject:str]) {
    NSLog(@"array 包含 str");
}

//2.count  数组中所含元素个数,不包括 nil
NSArray *array2 = [NSArray arrayWithObjects:@"AAA", @"BBBB", nil];
NSLog(@"count = %zi", array2.count);

//3.lastObject  返回数组最后一个元素
NSMutableArray *array5 = [NSMutableArray arrayWithObjects:@"aaa", @"bbbb", @"ccc",nil];
NSLog(@"%@", [array5 lastObject]);

//4.objectAtIndex 返回指定索引的元素
NSLog(@"%@", [array5 objectAtIndex:1]);

//5.indexOfObject  返回指定对象的下标
NSLog(@"%li", [array5 indexOfObject:@"bbbb"]);

//6.indexOfObject:inRange 返回范围内指定对象的下标
NSRange range8 = NSMakeRange(0, 3);
NSLog(@"%li", [array5 indexOfObject:@"ccc" inRange:range8]);

//7.firstObjectCommonWithArray  返回两个集合中第一个相同的对象元素
NSMutableArray *array6 = [NSMutableArray arrayWithObjects:@"aaa1", @"bbbb1", @"ccc",nil];
NSLog(@"%@", [array5 firstObjectCommonWithArray:array6]);

//8.subarrayWithRange: 截取范围内的数组元素
NSLog(@"%@", [array5 subarrayWithRange:range8]);

//六、数组排序

//1.reverseObjectEnumerator 数组倒序输出
NSArray *array8 = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
for (NSString *str  in [array8 reverseObjectEnumerator]) {
    NSLog(@"%@", str);
}

//七、遍历:

//定义一个数组
NSArray *arr = @[@"one",@"two",@"three",@"four"];

//对数组进行遍历
//1) 普通的方式,通过下标访问
for (int i = 0; i < arr.count; i++) {
    NSLog(@"-> %@",arr[i]);
}

//2) 快速枚举法 for循环的增强形式
for (NSString *str in arr) {
    NSLog(@"---> %@",str);
}

//3) 使用block的方式,进行访问
//stop:YES 会停止, stop:NO 不会停止
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if(idx == 2){
        *stop = YES; //停止  // break;
    }else{
        NSLog(@"idx = %ld,obj = %@",idx,obj);
    }
}];

//八、比较

NSArray *array = [NSArray array];
NSArray *array1 = [NSArray array];
if ([array isEqualToArray:array1]) {
    NSLog(@"YES");
}else {
    NSLog(@"NO");
}

//九、NSArray读写文件:

NSArray *array = [NSArray arrayWithObjects:@"one",@"zbz",@"cgx",@"sb",@"cjk",@"senni", nil];
//把NSArray 中的内容,写入到文件中   --arr.plist 一种特殊的文件格式
BOOL isWrite = [array writeToFile:@"/Users/apple/Desktop/testArray/arr.plist" atomically:YES];
if(isWrite){
    NSLog(@"写入成功");
}

//从文件中,读取一个数组信息
NSArray *readArr = [NSArray arrayWithContentsOfFile:@"/Users/apple/Desktop/testArray/arr.plist"];
NSLog(@"readArr = %@",readArr);

//十、NSArray切分与合并

//1、切分数组
NSString *string = @"One,Two,Three,Four";
NSArray *strArray = [string componentsSeparatedByString:@","];
NSLog(@"array:%@",strArray);
    
//2、从数组合并元素到字符串
NSArray *array = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];
NSString *str = [array componentsJoinedByString:@","];
NSLog(@"string:%@",str);

//十一、求数组的 交集,并集,差集

NSArray *array1 = @[@"1",@"2",@"3"];
NSArray *array2 = @[@"1",@"5",@"6"]; 
NSMutableSet *set1 = [NSMutableSet setWithArray:array1];
NSMutableSet *set2 = [NSMutableSet setWithArray:array2]; 

[set1 unionSet:set2];       //取并集后 set1中为1,2,3,5,6
[set1 intersectSet:set2];  //取交集后 set1中为1
[set1 minusSet:set2];      //取差集后 set1中为2,3,5,6

判断一个数组是否为另一个数组的子集

NSArray *array3 = @[@"1",@"2"];
NSArray *array4 = @[@"1",@"2",@"6"];
NSSet *set3 = [NSSet setWithArray:array3];
NSSet *set4 = [NSSet setWithArray:array4];

BOOL isSub = [set3 isSubsetOfSet:set4];     //isSub为YES

判断某个对象是否在某个数组中

BOOL isExist = [array3 containsObject:@"1"]; //isExist为YES

延伸
NSArray 用于对象有序集合(数组)
NSSet 用于对象无序集合 (集合)
NSDictionary用于键值映射(字典)
以上三种集合类是不可变的(一旦初始化后,就不能改变)

以下是对应的三种可变集合类(这三种可变集合类是对应上面三种集合类的子类):
NSMutableArray
NSMutableSet 可修改的集合。主要用于集合运算(并集,交集,差集)
NSMutableDictionary 允许用户添加和删除key和value

NSPointerArray

类似于数组的集合,但具有更广泛的可用内存语义;继承自NSObject;NSPointerArray具有以下特点:

与NSMutableArray一样,使用下标有序的插入或移除元素,且可修改数组内容;
可以插入或删除nil,并且 nil 参与 count 的计算;
count 可以 set,如果直接 set count,那么会使用 nil 占位;
可以使用 weak 来修饰成员;
成员可以是所有指针类型;
遵循 NSFastEnumeration,可以通过 for...in 来进行遍历。

创建和初始化新的指针数组
// 根据指定选项返回新指针数组
NSPointerArray *pointerArray = [[NSPointerArray alloc]initWithOptions:NSPointerFunctionsStrongMemory];

NSPointerFunctions *functions = [[NSPointerFunctions alloc]initWithOptions:NSPointerFunctionsStrongMemory];
// 根据指定函数返回新指针数组
NSPointerArray *pointerArray1 = [[NSPointerArray alloc]initWithPointerFunctions:functions];

// 返回一个强引用元素的数组
NSPointerArray *pointerArray2 = [NSPointerArray strongObjectsPointerArray];

// 返回一个弱引用元素的数组
NSPointerArray *pointerArray3 = [NSPointerArray weakObjectsPointerArray];
管理集合

// 设置数组元素数量
pointerArray.count = 5;

// 数组中元素数量
NSUInteger count = [pointerArray count];//5

// 数组中所有对象
[pointerArray allObjects];

// 指定索引处的指针
void *point = [pointerArray pointerAtIndex:0];//nil

// 数组中添加指针对象
[pointerArray addPointer:@"2"];//(2)

// 移除指定索引处的元素
[pointerArray removePointerAtIndex:0];//(2)

// 指定索引出插入元素
[pointerArray insertPointer:@"1" atIndex:0];//(1,2)

// 替换指定索引处的对象
[pointerArray replacePointerAtIndex:0 withPointer:@"2"];//(2,2)

// 删除数组中的nil值
[pointerArray compact];

// 获取数组的功能项
NSPointerFunctions *Functions = [pointerArray pointerFunctions];

相关文章

网友评论

      本文标题:NSArray

      本文链接:https://www.haomeiwen.com/subject/jyfkjltx.html