——–NSDictionary——–

C++/STL中有一种容器叫做map,OC中的NSDictionary与map很类似,是一个拥有键值对的类/数据结构。这个键值对的要求是键必须遵守NSCopying协议(NSString就遵守这个协议),值需要满足是OC对象。NSDictionary的元素不可变,而NSMutableDictionary中元素可变。


1). 创建方法

NSDictionary *dic1 = [NSDictionary new];
NSDictionary *dic2 = [[NSDictionary alloc] init];
NSDictionary *dic3 = [NSDictionary dictionary];//以上3种是没有意义的创建,无法更改,大小恒为0
NSDictionary *dic4 = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"Xi'an",@"address", nil];//添加两个键值对,需要注意的是先写键值对中的值,再写键,最后以nil结尾。
//快速创建方法,用大括号
NSDictionary *dic5 = @{@"name":@"rose",@"age":@"18",@"address":@"Beijing"};

2). 相关方法

//用%@就可以打印整个字典
NSLog(@"%@",dic5);
//用键来取值,有两种方法:下标或者自带的方法,需要注意的是如果没有指定的key,会返回nil
NSString *str1 = dic4[@"name"];
NSLog(@"%@",str1);
NSString *str2 = [dic4 objectForKey:@"address"];
NSLog(@"%@",str2);
//计算字典的大小
NSUInteger count = dic4.count;
NSLog(@"%lu",(unsigned long)count);
//遍历字典所以的键(值用allValues):
for(NSString *str in dic4.allKeys)
    NSLog(@"%@",str);  
//遍历字典 使用for-in循环遍历出来的是字典中所有的键
for(id item in dic4)
    NSLog(@"%@ = %@",item,dic4[item]);
//遍历字典 使用block
 [dic4 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        NSLog(@"%@ = %@", key ,obj);
        //key为元素的键,obj为元素的值,stop为YES时,终止遍历
}];

最后再讨论一下字典在内存中的存放:在内存中,字典的元素先用键进行哈希函数运算,将计算所得的结果作为存储的位置;取值的时候也是先对键进行哈希运算,再定位查找值。与NSArray相比,NSDictionary的查找效率是很高的,不需要对整个字典进行遍历;而NSArray在存放的时候效率更高,不需要进行哈希运算。

——–NSMutableDictionary——–

NSMutableDictionary是从NSDictionary继承而来的。因此我们仅对其特性进行讨论,其他方法略去。


1). 创建方法

NSMutableDictionary *dic6 = [NSMutableDictionary new];
NSMutableDictionary *dic7 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dic8 = [NSMutableDictionary dictionary];//以上3种都是有意义的创建,因为可以更改

NSMutableDictionary *dic9 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"Xi'an",@"address", nil];
NSMutableDictionary *dic10 = @{@"name":@"jack"};//error,右值是NSDictionary对象,子类指针指向父类对象,危险!

2). 相关方法

//新增与删除键值对
[dic9 setObject:@"19" forKey:@"age"];
[dic9 setObject:@"21" forKey:@"age"];//键重复了,此时保存的是后添加的,原有的被替换

[dic9 removeObjectForKey:@"age"];//删除键值为19的键值对
[dic9 removeAllObjects];//删除全部键值对

//字典数组信息持久化 读写磁盘
[dic9 writeToFile:@"Users/warwick/Desktop/abc.plist" atomically:NO];//将字典的内容写到磁盘上的文件中

NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:@"Users/warwick/Desktop/abc.plist"];//从文件中读取字典

最后一点内容
实际上,NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSSet….都是集合,一般情况下我们为了方便理解称其为数组,字典…实际上不称数组,字典数组…而是集合,字典集合。


在MRC模式下,将OC对象放入到集合中会不会影响其引用计数器呢?
答案是,每存储在集合一次,其引用计数+1,集合销毁,其引用计数-1。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐