我是靠谱客的博主 单纯画板,最近开发中收集的这篇文章主要介绍Objective-C中的NSDictionary、NSMutableDictionary详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

——–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。

最后

以上就是单纯画板为你收集整理的Objective-C中的NSDictionary、NSMutableDictionary详解的全部内容,希望文章能够帮你解决Objective-C中的NSDictionary、NSMutableDictionary详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部