数组:
数组是一个只存储任意类型的对象(指针),不可以存储普通类型数据。
数组是有序的,数组只有进过初始化后才可以使用。
不可变数组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];
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);
}
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";
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);
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];
}];
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];
NSMutableArray *mutableArray1 = [NSMutableArray arrayWithCapacity:0];
// 2.使用mutableCopy来创建。不可以使用copy,因为copy的使用是让编译器将mutableArray2认为为不可变数组,那么在执行不可变数组的方法时会因为找不到而报错。
NSMutableArray
*mutableArray2 =
@[].mutableCopy;
[mutableArray2 arrayByAddingObject:@"sdsds"];
[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);
// 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];
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);
//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