Objective-C中的NSDictionary、NSMutableDictionary详解
——–NSDictionary——–C++/STL中有一种容器叫做map,OC中的NSDictionary与map很类似,是一个拥有键值对的类/数据结构。这个键值对的要求是键必须遵守NSCopying协议(NSString就遵守这个协议),值需要满足是OC对象。NSDictionary的元素不可变,而NSMutableDictionary中元素可变。1). 创建方法...
——–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。
更多推荐
所有评论(0)