为什么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);