【阅读笔记】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;

相关文章

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

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

  • OC弱引用容器实现方案总结

    在OC中Foundation框架中的常用容器类(NSSet,NSDictionary,NSArray)及其可变子类...

  • 面试题

    1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...

  • 集合概述

    集合类又被称为容器类 OC集合大致上可分为: NSArray/代表有序。可重复的集合 索引访问 NSSet/无序。...

  • Objective-C相关

    重温OC,发现好些之前忽视的小细节,简单的梳理一下。 NSSet NSSet相关 NSArray 基础数据类型可以...

  • NSSet NSArray NSHashTable

    NSArray和NSSet NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储...

  • OC字典NSDictionary

    三种集合类 NSSArray 用于对象有序集合(NSObject对象)NSSet 用于对象的无序集合NSDicti...

  • OC中NSArray 、NSDictionary、 NSSet

    在做遍历的时候,除了for循环 for..in这两种基本的方法以外,还有一种更高效的方法——“块枚举法” NSAr...

  • 基础零碎

    1.NSArray和NSSet的区别 >.NSArray内存中存储地址连续,而NSSet不连续 >.NSSet...

  • NSSet

    NSSet:无序集合NSSet和NSArray的区别:NSArray可以通过角标获取元素,NSSet是无序的不能用...

网友评论

  • 飘零血: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