一、NSArray和NSMutableArray
(一)NSArray不可变数组
(1)NSArray的基本介绍
NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组。
C语言数组有一个缺点即数组中只能存放同种数据类型的元素。
OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。
(2)NSArray的创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// 普通数组的创建
int a = 5;
int ages[10] = {1, 2, 3, 4};
// 创建一个Person对象的数组
Person *p = [[Person alloc] init];
Person *persons[5] = {p, [[Person alloc] init]};
// NSArray 的创建
NSArray *array = [NSArray array];
// 0. 这个array永远是个空数组
NSArray *array2 = [NSArray arrayWithObject:@"ehe"];
// 1. 这个数组只有一个元素,且永远只有一个元素
// nil 是数组元素结束的标记
NSArray *array3 = [NSArray arrayWithObjects:@"xiaoming", @"xiaohong", nil];
// 2. 这个数组中有多个元素,以nil结尾
// 3.快速创建一个NSArray对象
NSArray *array4 = @[@"jack", @"rose", @"134234"];
|
(3)NSArray的访问
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 获取 NSArray 的元素个数
// 使用 count 方法
[array2 count];
NSLog(@"%ld", array2.count);
// NSArray中元素的访问
// 1. 使用索引
NSLog(@"%@", [array2 objectAtIndex:0]);
// 2. 像c语言数组一样使用下标
NSLog(@"%@", array2[0]);
|
(4)NSArray的遍历
数组的遍历有以下几种方式:
首先创建一个数组
1
2
|
Person *p = [[Person alloc] init];
NSArray *array = @[p, @"heh", @"jack"];
|
第一种方法:使用for循环遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// 2. 快速便利
// id obj 代表着数组中的每个元素
int i = 0;
for (id obj in array)
{
// 找出 obj 元素中在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld - %@", i,obj);
// 结束便利
if (i == 1)
{
break;
}
}
// 3. 使用block遍历
// 每遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
}];
|
Block遍历的深入研究:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/// 现在此方法会报错了
void ^(myBlock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
if (idx == 0)
{
// 停止遍历
*stop = YES;
}
};
for (int i = 0; i < array.count; i++)
{
// 用来标记是否需要停止遍历
BOOL isStop = NO;
// 取出元素
id obj = array[i];
myBlock(obj, i, &isStop);
if (isStop)
{
break;
}
}
|
每拿到一个元素,就传递给obj,就会调用一次block,并且把当前的元素和索引位置当做参数传递给block。
注意1:break只使用在两种场合,即switch和循环结构中。
注意2:stop参数用来停止遍历,其值若为YES,则停止。
(二)NSMutableArray可变数组
(1)NSMutableArray的基本使用
注意:NSMutableArray 继承自 NSArray,几乎拥有 NSArray 的一切方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// 创建一个可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"xiaoming", nil];
// 添加元素
// 添加一个 Person 类对象元素
[array addObject:[[Person alloc] init]];
// 添加一个字符串对象元素
[array addObject:@"xiaoming"];
// 错误写法
// oc数组中得元素不能为空值
// [array addObject:nil];
// 删除元素
// 删除所有的元素
[array removeAllObjects];
// 删除指定的对象
[array removeObject:@"xiaoming"];
//删除指定索引的元素
[array removeObjectAtIndex:0];
// 打印数组
NSLog(@"%@", array);
NSLog(@"%ld", array.count);
|
二、NSSet和NSMutableSet
(一)NSSet不可变集合
基本使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 创建一个NSSet
NSSet *s = [NSSet set];
// 因为不可变,所以 s 永远都为空
// 创建一个有多个元素的 NSSet
NSSet *s2 = [NSSet setWithObjects:@"xiaoming",@"haha", nil];
// 随机取出一个元素
NSString *str = [s2 anyObject];
// 打印
NSLog(@"%@", str);
// 打印结果
2016-07-31 01:02:20.904 test[3904:1421519] xiaoming
|
(二)NSMutableSet可变集合
基本使用:
1
2
3
4
5
6
7
8
9
10
11
12
|
// 创建一个 NSMutableSet
NSMutableSet *s = [NSMutableSet set];
// 添加元素
[s addObject:@"xiaoming"];
// 删除元素
// 删除指定元素
[s removeObject:(nonnull id)];
// 删除所有元素
[s removeAllObjects];
|
(三)NSSet和NSArray的对比
(1)共同点:
-
都是集合,都能够存放多个对象
-
只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)。
-
本身都不可变,都有一个可变的子类。
(2)不同点:
NSArray 有顺序,NSSet 没有顺序
三、NSDictionary 和 NSMutableDictionary
(一)NSDictionary 不可变字典
(1)介绍
现实中的字典:根据索引找到具体的内容
OC 中的 NSDictionary:根据 key 找到 value。里面存储的东西都是键值对。
(2)NSDictionary的创建
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// 创建字典
// 第一种方式
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
// 第二种方式
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"yangeyong", @"南昌"];
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
// 第三种方式
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:
@"xiaoming", @"name",
@"北京", @"Address",
@"1348494949", @"qq",
nil];
// 第三种方式,快速创建
NSDictionary *dic2 = @{@"name" : @"xiaoming",
@"address" : @"北京"};
|
注意:快速创建字典是编译器特性。
(3)NSDictionary的访问
1
2
3
4
5
6
7
8
9
10
11
|
// 基本使用
// 根据 key 获取对应的值
id obj = [dict objectForKey:@"name"];
// 快速访问
id obj1 = dict[@"name"];
// 打印
NSLog(@"%@", obj);
// 返回的是键值对的个数
// count 方法获取当前字典中键值对的个数
NSLog(@"%ld", dict.count);
|
(4)NSDictionary的遍历
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// 字典不允许有相同的 key ,但允许有相同的 value (object)
// 字典是无序的
// 快速创建一个字典
NSDictionary *dict = @
{
@"adress" : @"北京",
@"name" : @"jack",
@"name2" : @"xiaoming"
};
// 字典的便利
// 第一种方式,使用for循环
NSArray *keys = [dict allKeys];
[keys enumerateObjectsUsingBlock:^
(NSString *key, NSUInteger idx, BOOL * _Nonnull stop)
{
NSString *object = dict[key];
NSLog(@"%@, %@", key, object);
}];
// 第二种方式,使用block
[dict enumerateKeysAndObjectsUsingBlock:^
(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop)
{
NSLog(@"%@ - %@", key, obj);
}];
|
(二)NSMutableDictionary可变字典
(1)NSMutableDictionary的基本使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// 可变字典的基本使用
// 创建一个空的可变字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 添加键值对
[dict setObject:@"xiaoming" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rese" forKey:@"name"];
// 删除键值对
// 删除特定键值对
[dict removeObjectForKey:(nonnull id)];
// 删除所有得键值对
[dict removeAllObjects];
// 获取 namekey 对应的值
NSString *str = dict[@"name"];
// 打印数组
NSLog(@"%@", @[@"XIAOMING", @"ROSE"]);
// 打印字典
NSLog(@"%@", dict);
// 打印结果
2016-07-31 01:33:36.466 test[4260:1513182] (
XIAOMING,
ROSE
)
2016-07-31 01:33:36.466 test[4260:1513182] {
}
|
(2)NSMutableDictionary的使用注意
1
2
3
|
// 字典的使用注意
NSMutableDictionary *dict = @{@"name" : @"j"}; //这样会报警
[dict setObject:@"xiaoming" forKey:@"name"];
|
注意:这种快速创建的方式只适用于不可变字典。