【阅读笔记】OC类库-NSArray,NSSet,NSDicti

作者: 亲爱的大倩倩 | 来源:发表于2016-07-19 13:50 被阅读840次

    关于这三大集合类,他们本身就能实现很多功能,但若不了解的话,可能会盲目的自己写,今天总结一下常用的.

    简介

    • NSArray是对象的有序集合(可存储不同类型的对象),在内存中存储位置是连续的
    • NSSet是对象的无序集合(可存储不同类型的对象),在内存中存储方式是不连续的
    • NSDictionary是键值对的集合(可存储不同类型的对象),注意key在整个字典中是唯一的,若多个key相等,也只能取出一个
      以上三种集合类一旦初始化后,就不可改变.对应三种可变集合类
      NSMutableArray
      NSMutableSet
      NSMutableDictionary
      注意:
    1. 这些集合类只能收集NSObject对象,如果想保存基本数据类型,需要封装成NSNumber对象.
    2. 打印的时候注意,NSLog不支持中文

    ** NSArray和NSSet的主要区别是,在搜索元素时, NSSet效率较高**
    NSArray:若要查找元素A是否在数组,需要遍历整个数组
    NSSet:查找时用到了ha'sh算法(散列,也称哈希),不论是插入还是查找,一个hash过程就能找到A存储的位置

    个人感觉我们的NSArray就是C中的数组, NSSet就是C中的链表, NSDictionary就是C中的map

    • 数组:查找时需要遍历数组,速度较慢,不可变数组也可以添加元素,但本质是销毁原来的数组,生成一个新的数组.
    • 链表:每个元素都有个前指针和后指针,能快速的移动或删除

    共性

    继承 : NSObject
    实现协议 : <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
    
    下面分别介绍各个的常用方法

    NSArray及NSMutableArray
    NSMutableArray : NSArray

    类型
    NSArray是基于C底层CFArray/CFArrayRef实现的,NSArray 可以看做是一个 CFArrayRef 的 Wrapper类.
    NSArray的真正类型是__NSArrayI(Immutable)
    NSMutableArray的真正类型是__NSArrayM(_internal)

    NSArray类

    初始化,计算长度,按下标取值
    - (instancetype)init;
    @property (readonly) NSUInteger count;
    - (ObjectType)objectAtIndex:(NSUInteger)index;
    //初始化的几种方法
    NSArray *arr = [[NSArray alloc] initWithObjects:@”1”, @”2”, nil]; 
    NSArray * arr =[NSArray arrayWithObjects:@”1”,@”2”,nil];
    NSArray * arr =@[@“1”,@”2”]; 
    

    NSArray(NSExtendedArray)类别

    //在当前数组中追加一个新的对象,返回一个新的数组对象
    - (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
    //在某一数组A后追加一新的数组B,返回一个新的数组C
    - (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    //用你输入的separator字符,分割当前数组,返回一串字符串,假如数组内容为@"1",@"2",@"3", nil 若separator为!!!,则输出字符串为1!!!2!!!3!!!
    - (NSString *)componentsJoinedByString:(NSString *)separator;
    //检测数组中是否包含指定数据,包含返回YES,不包含返回NO
    - (BOOL)containsObject:(ObjectType)anObject;
    //数组A和数组B比较,数组A的对象按顺序遍历数组B全部对象,返回数组B和数组A第一个相同的元素,若均不相同,返回null
    - (nullable ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray;
    //判定某一对象是否存在于数组中,若存在,返回的就是对象下标,不存在返回的是一长串数字,可将返回值和NSNotFound对比,将返回的一长串数字改为提醒
    - (NSUInteger)indexOfObject:(ObjectType)anObject;
    //判定某一对象是否存在于数组某一范围中(只在此范围内差查找),若存在则返回下标,不存在返回NSNotFound
    - (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
        //示例
        if([arr indexOfObject:@"3" inRange:NSMakeRange(2,2)] == NSNotFound)
            NSLog(@"未找到");
        else
            NSLog(@"%lu",[arr indexOfObject:@"3" inRange:NSMakeRange(2,2)]);
    //比较两个数组是否相同,长度和内容都相同返回YES,否则返回NO
    - (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
    //获取数组第一个元素和最后一个元素,若数组只初始化未赋值,返回null
    @property (nullable, nonatomic, readonly) ObjectType firstObject;
    @property (nullable, nonatomic, readonly) ObjectType lastObject;
    
    
    

    description说明
    NSLog函数进行打印的时候会自动调用description方法,默认情况下,NSLog和%@输出对象时返回的是类名和内存地址,我们可以重写对象的description方法.
    ** NSMutableArray类**
    添加

    //尾部添加一个元素
    - (void)addObject:(ObjectType)anObject;
    //尾部添加一个数组
    - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    

    插入

    //在指定索引处插入一个元素,原来的元素后移 
    - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    //在指定索引集合处插入一个数组元素,相当于批次insertObject: atIndex:
    - (void)insertObjects:(NSArray<ObjectType> *)objects atIndexes:(NSIndexSet *)indexes;
    

    移除

    //移除最后一位
    (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    //按指定索引移除
    (void)removeObjectAtIndex:(NSUInteger)index;
    //移除全部
    (void)removeAllObjects;
    //若数组某一范围内有元素anObject,则移除
    (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
    //移除你指定的元素anObject,若数组中没有,则不移除
    (void)removeObject:(ObjectType)anObject;
    //移除和otherArray中共同的元素
    - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
    //移除数组某一范围
    - (void)removeObjectsInRange:(NSRange)range;
    

    替换

    //替换对应索引位置的元素
    - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
    //交换对应索引位置的元素
    - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
    //等效于先removeAllObjects后addObjectsFromArray 
    - (void)setArray:(NSArray<ObjectType> *)otherArray;
    

    NSSet和NSMutableSet
    NSMutableSet : NSSet

    ** NSSet类**
    初始化

    //类方法
    //不赋值初始化
    + (instancetype)set;
    //单个元素初始化
    + (instancetype)setWithObject:(ObjectType)object;
    //多个元素初始化
    + (instancetype)setWithObjects:(ObjectType)firstObj;
    //其他set对象初始化
    + (instancetype)setWithSet:(NSSet<ObjectType> *)set;
    //数组对象初始化
    + (instancetype)setWithArray:(NSArray<ObjectType> *)array;
    //相对应的对象方法
    - (instancetype)initWithObjects:(ObjectType)firstObj;
    - (instancetype)initWithSet:(NSSet<ObjectType> *)set;
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array;
    

    其他常用方法

    //以数组的形式获取集合中的所有对象  
    @property (readonly, copy) NSArray<ObjectType> *allObjects;
            NSArray *allObj = [set allObjects];  
            NSLog(@"allObj :%@", allObj); 
    //获取任意一个元素,但每次实验都是获取第一个元素
    - (nullable ObjectType)anyObject;
    //判断是否包含anObject
    - (BOOL)containsObject:(ObjectType)anObject;
    //判断两个set是否相等
    - (BOOL)isEqualToSet:(NSSet<ObjectType> *)otherSet;
    //判断set是否是otherSet的子集
    - (BOOL)isSubsetOfSet:(NSSet<ObjectType> *)otherSet;
    

    ** NSMutableSet类**
    添加

    //添加对象
    - (void)addObject:(ObjectType)object;
    //向集合中添加另一集合,重复的对象只会有一个(合并集合)
    - (void)unionSet:(NSSet<ObjectType> *)otherSet;
    
    

    删除

    //删除某一元素
    - (void)removeObject:(ObjectType)object;
    //删除全部
    - (void)removeAllObjects;
    //向集合中删除另一个集合出现的元素
    - (void)minusSet:(NSSet<ObjectType> *)otherSet;
    //向集合中删除另一个集合没出现的元素(只留下相等元素)
    - (void)intersectSet:(NSSet<ObjectType> *)otherSet;
    

    NSDictionary和NSMutableDictionary

    NSMutableDictionary : NSDictionary

    ** NSDictionary类**
    初始化

    - (instancetype)initWithObjectsAndKeys:(id)firstObject;
    - (instancetype)init;
    - (instancetype)initWithObjects:(const ObjectType [])objects forKeys:(const KeyType [])keys count:(NSUInteger)cnt;
    

    取值

    //获得所有key值
    @property (readonly, copy) NSArray<KeyType> *allKeys;
    //获得所有Value值
    @property (readonly, copy) NSArray<ObjectType> *allValues;
    //根据key值取value
    - (nullable ObjectType)objectForKey:(KeyType)aKey;
    //取出Value的全部key值
    - (NSArray<KeyType> *)allKeysForObject:(ObjectType)anObject;
    
    

    其他

    //将字典的key变成一个枚举对象用于遍历
    - (NSEnumerator<KeyType> *)keyEnumerator;
    //快速枚举
        for(id key in dic)
        {
            NSLog(@"key: %@,value: %@",key,[dic objectForKey:key]);
        }
    

    ** NSMutableDictionary类**
    取值

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

    增加

    //若无此键,直接增加,若有,则更改键的内容
    - (void)setObject:(ObjectType)anObject forKey:(KeyType <NSCopying>)aKey;
    //将原字典清空,再赋给他新字典
    - (void)setDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
    //将两个字典拼接成一个字典
    - (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
    

    删除

    //删除某一元素,key
    - (void)removeObjectForKey:(KeyType)aKey;
    //删除部分元素(数组中有的)
    - (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray;
    //删除全部
    - (void)removeAllObjects;
    

    其他

    使用本地文件内容创建可变字典
    - (nullable NSMutableDictionary<KeyType, ObjectType> *)initWithContentsOfFile:(NSString *)path;
    

    相关文章

      网友评论

      • 飘零血:NSArray类似C++中的链表存储在堆上,地址不一定连续,(可存储不同类型的对象,但必须是NSObject的子类,从本质上说还是必须同类型)。
        飘零血:但是真正的链表可以存储无类型指针(void *),那才是真正的任意类型, NSArray还是有OC的特点,毕竟是数组,所以还是做了类型限定(id/NSObject *)。
      • Noah1985:谁告诉你NSArray里的对象在内存中是连续的?又不是c的数组。。。NSArray本身是链表实现的
      • SMFly:比如说下面的表现形式NSArray *btArr = @[_saveBt,_cancelBt,_delayBt];
        SMFly:这个数组元素的地址显然应该不是连续的

      本文标题:【阅读笔记】OC类库-NSArray,NSSet,NSDicti

      本文链接:https://www.haomeiwen.com/subject/eqnpjttx.html