为什么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];
网友评论