OC中的集合

OC中的集合包含哪些?

包括NSArray、NSDictionary 和它们对应的子类 NSMutableArray、NSMutableDictionary.

数组的持久化

将数组中所有的元素的值存储到磁盘上的文件中.

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

从plist文件中还原数组.

+(nullable NSArray *)arrayWithContentsOfFile:(NSString *)path;

NSDictionary存在的理由?

NSArray和NSMutableArray是OC中的数组

它们存储数据的特点是每一个元素都是紧密相连的,通过下标获取存储的值.

它们的缺点是数组元素的下标不固定,增加、删除、插入等等操作后,数组元素的下标会相应发生改变.

所以我们希望有一种存储方式,存储到数组中,可以快速唯一的确定数据的元素.

所以字典数组(NSDictionary、NSMutableDictionary)这种键值对(key - value)的存储方式就出现了

key - value

key 就是键, 就是为数据取的别名,键只能是遵守了NSCoping协议的对象,而NSString就是遵守了这个协议,所以字符串对象可以作为key值.

value 就是值,就是真正存储的数据,只能是OC对象.

常用的创建字典数组的方法

+(instancetype)dictionaryWithObjectsAndKeys:(id)firstObject,...

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"rose",@"name",@"18",@"age",@"178.5",@"height",nil];

依次的将值、键写在参数,最后1个写nil.

简要NSDictionary字典数组的方法

NSDictionary *dict = @{键1:值1,键2:值2,键3:值3 ......};

NSDictionary *dict = @{

       @"name":@"rose",

       @"age":@"18",

       @"height":@"178.6"

 };

如何取出存储在字典数组中的数据?

1). 字典数组中的数据不能使用下标去取.只能使用key取key对应的值.

2). 如何使用key取到这个key所对应的值.

a. 使用中括弧,在中括弧中写上别名,就可以取到这个别名对应的数据.

dict[别名];

 b.调用字典对象的方法.

-(nullable ObjectType)objectForKey:(KeyType)aKey;

如果给定的Key不存在,取到的就是nil.

ps:字典数组中的键是不能重复的,因为键是用来区分字典数组中值的唯一标识.

如何取到字典数组中键值对的个数?

@property(readonly)NSUInteger count;

NSDictionary字典数组的遍历

1). 因为NSDictionary字典数组中的取值是依靠键来取值的,所以无法通过下标来取值.

2).使用for in循环.

    注意的一点是: 遍历出来的数据是字典中的key,要取值的话,还要通过key去取值.

    for(NSString *key in dict){

         NSLog(@"%@ = %@",key,[dict objectForKey:key]);

     }

3). 使用block来遍历字典数组.

-(void)enumerateKeysAndObjectsUsingBlock:(void(^)(KeyType key,ObjectType obj,BOOL *stop))block;

[dict enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key,id  _Nonnull obj,BOOL * _Nonnull stop){

         //key遍历出来的键.

         //obj遍历出来的值.

         //stop指针.

         NSLog(@"%@ = %@",key,obj);

        if([key isEqualToString:@"age"]){

            *stop = YES;

         }

  }];

NSDictionary数组存储数据的原理

当我们往字典数组中存储键值对的时候,这个键值对不是挨个挨个的存储的,而是根据键值做一个哈希算法算出一个下标,然后把这个键值对存储到这个字典数组中对应下标处.

我们取值是通过key取值的,这个时候仍然是根据这个key值做一个哈希算法算出这个key所在的下标,然后取值.

NSArray和NSDictionary分别的使用场景?

如果我们往数组中存储数据,存储进去以后,凡是要取数据都是全部取出来.使用NSArray.如果取值的时候,只会取其中的特定的几个,就使用NSDictionary数组.

可变字典数组(NSMutableDictionary) 

是NSDictionary的子类,所以它也是以键值对的形式来存储数据,和父类的不同之处是它的键值对可以动态的新增和删除.

创建可变字典数组

NSMutableDictionary *dict1 =  [NSMutableDictionary new];

NSMutableDictionary *dict2 =  [[NSMutableDictionary alloc] init];

NSMutableDictionary *dict3 =  [NSMutableDictionary dictionary];

上面的这些方法创建出来的可变字典的长度是0,这是有意义的.因为NSMutableDictionary对象可以动态的新增和删除键值对.

最常使用创建NSMutableDictionary对象的方法

NSMutableDictionary *dict4 =  [NSMutableDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"17",@"age",nil];

ps: NSMutableDictionary *dict5 = @{}, 这么创建是不行的.

新增键值对

-(void)setObject:(ObjectType)anObject forKey:(KeyType )aKey;

值可以是任意的OC对象,键必须是遵守了NSCopying协议的对象,NSString就是遵守了这个协议.

如果键重复,后新增会将前面的值覆盖掉,值是可以重复的.

删除键值对

[dict removeAllObjects];//全部清空

[dict removeObjectForKey:@"name"];//删除这个键对应的键值对.

字典数组也可以持久化为1个plist文件

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

//根据路径拿到字典数组

+(nullable NSDictionary *)dictionaryWithContentsOfFile:(NSString *)path;

集合的内存管理

在MRC中将对象存储到集合之中,会为这个对象的引用计数器+1,当集合销毁的时候,就会向存储在集合中的所有对象发送一条release消息.

使用@[] 或者@{ }创建的集合已经被autorelease过了,直接调用和类同名的类方法创建的对象也是被autorelease过的.

在ARC的模式下,集合的元素是一个强类型的指针.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342