A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhao543 中级黑马   /  2017-6-10 23:15  /  1203 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 先回顾一下NSArray和NSMutbaleArray.
    是OC中的数组.
    NSMutableArray数组的缺点:

    NSMutableArray数组中的元素一旦删除.
    这个元素后面的元素的下标会发生变化 会往前顶.

    下标不靠谱. 要找到数组中特定的1个元素 不要使用下标去找,因为元素的下标可能会发生变化.


    需求: 希望有一种靠谱的方式来快速定位数组中的元素.
        
    每存储1个数据,都要求为这个数据取1个别名,
    要找存储在数组中的数据的时候,不是通过下标来找,而是通过别名来找.
    这样就算数组的元素的下标发生了变化. 不影响我们查找数据.因为我们不是通过下标来找数据 而是通过别名来找.

    这中存储数据的方式我们叫做 键值对 的存储方式.
    每存储1个数据(值) Value,都要为这个数据取1个别名(键).Key

    NSDictionay 和 NSMutableDictionary 就是以键值对的形式来存储数据的.


2. NSDictionary数组.

    1). 不可变字典数组.
    2). 特点:
        a. 首先是1个数组.
        b. 是以键值对的形式来存储数据的
        c. 存储的数据只能是OC对象.别名只能是遵守了NSCopying协议的OC对象. NSString就是遵守这个协议的.
        d. 存储的键值对是固定的.不能动态的新增和删除.


3. 创建NSDictionary字典数组.

    1). 这是1个类.要使用它的话,就必须要创建对象来使用.

         NSDictionary *dict1 = [NSDictionary new];
         NSDictionary *dict2 = [[NSDictionary alloc] init];
         NSDictionary *dict3 = [NSDictionary dictionary];

        这样的创建出来的字典数组,没有意义.这个时候这个字典数组的长度为0
        而这个字典数组无法新增和删除元素.所以没有意义.


    2). 常用的创建字典数组的方法

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

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

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


    3). 简要NSDictionary字典数组的方式.

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

         NSDictionary *dict = @{
            @"name":@"rose",
            @"age":@"18",
            @"height":@"178.6"
         };
         


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

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

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

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

           dict[别名];

        b. 调用字典对象的方法.
            
           - (nullable ObjectType)objectForKey:(KeyType)aKey;


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


5.  取到字典数组中键值对的个数.

     @property (readonly) NSUInteger count;


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

     如果键重复???????


7. NSDictionary字典数组的遍历.


    1). 因为 NSDictionary字典数组中的取值是依靠键来取值的.无法通过下标来取值.
        所以,for循环遍历下标的方式就不可以的啦...

    2). 使用for in 循环.
        注意的1点是: 遍历出来的数据是字典中的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;
         }
     }];
     



8. NSDictionary数组存储数据的原理.

    1). 当我们往字典数组中存储键值对的.这个键值对不是挨个挨个的存储的.

    2). 当我们要往这个字典数组中存储1个键值对的时候,
        这个键值对要存储到哪1个下标中呢 ?
        根据键做1个哈希算法和数组的长度 算出1个下标来.
        然后把这个键值对存储到这个字典数组中对应下标处.

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


    与NSArray的区别.

    1). NSArray是1个1个的挨个存储.
        NSDictionary不是挨个存储的.每1个键值对要存储在哪个下标处 都是通过算出来的.
        所以,存储数据的时候,肯定是NSArray的效率高1些.

    2). 取数据的时候.
        如果我们要讲数组中的所有的元素取出来.
        取的时候,肯定是NSArray快.
        NSArray挨个挨个的取就可以 而字典每取1个就要算1下.


    3). 使用场景.

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


        


-------------------------------

1. NSMutableDictionary.可变字典数组.

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


   

2. 创建可变字典数组.

     NSMutableDictionary *dict1 =  [NSMutableDictionary new];
     NSMutableDictionary *dict2 =  [[NSMutableDictionary alloc] init];
     NSMutableDictionary *dict3 =  [NSMutableDictionary dictionary];
     上面的这些方法创建出来的可变字典的长度是0 这是有意义的.因为可以动态的新增和删除.

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


    注意:

    NSMutableDictionary *dict3 = @{}; 这么做是不行的.


3. 如何新增键值对.


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

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

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



4. 删除键值对.


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




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


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



    //将pist文件还原为1个字典 返回值的类型NSDictionary
    //但是实际的对象,是1个可变的.
    + (nullable NSDictionary<KeyType, ObjectType> *)dictionaryWithContentsOfFile:(NSString *)path;






1 个回复

倒序浏览
这个很专业嘛
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马