美文网首页
OC集合类之NSArray、NSMutableArray(一)

OC集合类之NSArray、NSMutableArray(一)

作者: 浅_若清风 | 来源:发表于2018-05-07 14:36 被阅读0次

    一、NSArray(不可变数组)

    概述:

    NSArray是一个Cocoa类,用来存储对象的有序列表。我们可以在NSArray中放入任意类型的对象:NSString对象、字典对象、其他数组对象等。

    限制:

    NSArray类有两个限制:一是只能存储OC的对象,不能存储原始的C语言基础数据类型,例如int、float、enum、struct和NSArray中的随机指针;二是不能存储nil(对象的零值或NULL值)。

    实例方法:

    //取值
    - (ObjectType)objectAtIndex:(NSUInteger)index;
    
    //创建数组对象(初始化方法)
    - (instancetype)initWithObjects:(constObjectType_Nonnull[_Nullable])objects count:(NSUInteger)cntNS_DESIGNATED_INITIALIZER;
    
    //原数组最后加一个对象,返回一个新的数组
    - (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
    
    //在原数组的最后添加另一个数组中的所有对象,返回一个新数组
    - (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    //数组转字符串
    - (NSString *)componentsJoinedByString:(NSString *)separator;
    
    //判断一个元素是否存在于数组中(地址比较)
    - (BOOL)containsObject:(ObjectType)anObject;
    
    //遍历数组中的所有内容 将内容拼接成一个新的字符串返回(NSLog打印时调用)
    - (NSString *)descriptionWithLocale:(nullable id)locale;
    
    //获取第一个包含于另一个数组中的元素
    - (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;
    
    //返回消息接收者与otherArray第一个相同的元素
    - (nullable ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray;
    
    //将数组中一定范围的元素读取到一个C数组中 objects参数需要为分配好空间的C指针
    - (void)getObjects:(ObjectType _Nonnull __unsafe_unretained [_Nonnull])objects range:(NSRange)range NS_SWIFT_UNAVAILABLE("Use 'subarrayWithRange()' instead");
    
    //返回数组中元素为anObject的下标
    - (NSUInteger)indexOfObject:(ObjectType)anObject;
    
    //返回某个范围内的元素的下标值
    - (NSUInteger)indexOfObject:(ObjectType)anObject inRange:(NSRange)range;
    
    //获取与给定元素相同的元素在数组中的最小下标值
    - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject;
    
    //在一定范围内获取与给定元素相同的元素在数组中的最小下标值
    - (NSUInteger)indexOfObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
    
    //判断两个数组是否相同
    - (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray;
    
    //数组的枚举(正序)
    - (NSEnumerator<ObjectType> *)objectEnumerator;
    
    //数组的枚举(逆序)
    - (NSEnumerator<ObjectType> *)reverseObjectEnumerator;
    
    //基于函数指针的排序
    - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context;
    
    //基于函数指针的排序
    - (NSArray<ObjectType> *)sortedArrayUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType, ObjectType, void * _Nullable))comparator context:(nullable void *)context hint:(nullable NSData *)hint;
    
    //存储字符串的数组排序
    - (NSArray<ObjectType> *)sortedArrayUsingSelector:(SEL)comparator;
    
    //截取数组一部分创建的新数组
    - (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range;
    
    //将数组写入指定url路径
    - (BOOL)writeToURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    
    //为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止(无参数)
    - (void)makeObjectsPerformSelector:(SEL)aSelector NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
    
    //为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止(有一个参数)
    - (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(nullable id)argument NS_SWIFT_UNAVAILABLE("Use enumerateObjectsUsingBlock: or a for loop instead");
    
    //获取对应下标元素
    - (NSArray<ObjectType> *)objectsAtIndexes:(NSIndexSet *)indexes;
    
    //数组的下标方法 子类重写
    - (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));
    
    //对数组中的元素进行枚举遍历(正常遍历)
    - (void)enumerateObjectsUsingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //倒序遍历(并发时使用)
    - (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //指定某一个
    - (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //根据条件进行数据遍历查找符合条件的元素下标
    - (NSUInteger)indexOfObjectPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //根据条件进行数据遍历(添加参数来表示遍历是从前向后遍历还是从后遍历)
    - (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //添加了参数NSIntexSet 参数,用来获取子数组,然后使用这个子数组进行遍历,处理数据
    - (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //根据block 的处理获取一个NSIndexSet 对象
    - (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //添加参数,表示是从前向后,还是从后向前遍历
    - (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //添加参数NSIndexSet 用来获取子数组,使用子数组进行遍历
    - (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (NS_NOESCAPE ^)(ObjectType obj, NSUInteger idx, BOOL *stop))predicate API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //对数组进行排序操作(参数cmptr 是一个block 函数块,返回的数据类型是一个NSComparisonResult 对象)
    - (NSArray<ObjectType> *)sortedArrayUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //进行排序操作(NSSortOptions 排序的参数 用来表示是同时排序,还是稳定执行)
    - (NSArray<ObjectType> *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //指定区域返回通过代码块方法的索引
    typedef NS_OPTIONS(NSUInteger, NSBinarySearchingOptions) {
        NSBinarySearchingFirstEqual = (1UL << 8),
        NSBinarySearchingLastEqual = (1UL << 9),
        NSBinarySearchingInsertionIndex = (1UL << 10),
    };
    
    //数组的二分查找(线性表必须采用顺序存储结构,而且表中元素按关键字有序排列)
    - (NSUInteger)indexOfObject:(ObjectType)obj inSortedRange:(NSRange)r options:(NSBinarySearchingOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmp API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    

    类方法:

    //创建数组对象
    + (instancetype)array;
    
    //通过一个元素创建数组对象
    + (instancetype)arrayWithObject:(ObjectType)anObject;
    
    //通过数组元素创建数组对象
    + (instancetype)arrayWithObjects:(const ObjectType _Nonnull [_Nonnull])objects count:(NSUInteger)cnt;
    
    //通过一组元素创建数组对象
    + (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    
    //通过另一个数组创建数组对象
    + (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;
    
    //创建数组对象(初始化方法)
    - (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
    
    //创建数组对象(初始化方法)
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array;
    
    //创建数组对象(初始化方法)
    - (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;
    
    //从指定的URL读取存储在NStRealType格式中的数组
    - (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url error:(NSError **)error  API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
    
    //从指定的URL读取存储在NStRealType格式中的数组
    + (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url error:(NSError **)error API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0)) NS_SWIFT_UNAVAILABLE("Use initializer instead");
    
    

    二、NSMutableArray(可变数组)

    概述:

    NSArray创建的是不可变对象的数组,即一旦创建了一个包含特定数量的对象的数组,就不能对数组进行添加、删除元素的操作。 NSMutableArray 继承至 NSArray,是为了弥补NSArray类的不足。

    实例方法:

    //数组尾部添加一个元素
    - (void)addObject:(ObjectType)anObject;
    
    //在指定索引处插入一个元素,原来的元素后移
    - (void)insertObject:(ObjectType)anObject atIndex:(NSUInteger)index;
    
    //删除数组中最后一个元素
    - (void)removeLastObject;
    
    //删除指定位置元素
    - (void)removeObjectAtIndex:(NSUInteger)index;
    
    //替换对应索引位置的元素(索引必须有效)
    - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(ObjectType)anObject;
    
    //初始化函数
    - (instancetype)init NS_DESIGNATED_INITIALIZER;
    
    //指定初始化函数
    - (instancetype)initWithCapacity:(NSUInteger)numItems NS_DESIGNATED_INITIALIZER;
    
    - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
    
    //数组尾部添加一个数组
    - (void)addObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    //交换对应索引位置的元素(索引必须有效)
    - (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
    
    //删除所有元素
    - (void)removeAllObjects;
    
    //使用anObject 对象替换 range 位置上的元素,相当于删除 range位置的元素,然后在把 anobject 插入到这个位置
    - (void)removeObject:(ObjectType)anObject inRange:(NSRange)range;
    
    //删除和anObject对象一样的元素
    - (void)removeObject:(ObjectType)anObject;
    
    //使用anObject 对象替换 range 位置上的元素,相当于删除 range位置的元素,然后在把 anobject 插入到这个位置
    - (void)removeObjectIdenticalTo:(ObjectType)anObject inRange:(NSRange)range;
    
    //删除下标最小的某个元素 
    - (void)removeObjectIdenticalTo:(ObjectType)anObject;
    
    //删除一定范围内的所有元素
    - (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt API_DEPRECATED("Not supported", macos(10.0,10.6), ios(2.0,4.0), watchos(2.0,2.0), tvos(9.0,9.0));
    
    //移除给定数组中的元素
    - (void)removeObjectsInArray:(NSArray<ObjectType> *)otherArray;
    
    //移除指定range 上的所有元素
    - (void)removeObjectsInRange:(NSRange)range;
    
    //使用otherArray 数组中 otherRange 位置上的元素,替换当前数组中 range 位置上的元素
    - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray range:(NSRange)otherRange;
    
    //使用otherArray 数组上的位置,替换 range 上的元素
    - (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray<ObjectType> *)otherArray;
    
    //等效于删除所有数组后在尾部添加一个数组
    - (void)setArray:(NSArray<ObjectType> *)otherArray;
    
    //对当前的数组排序,使用排序算法
    - (void)sortUsingFunction:(NSInteger (NS_NOESCAPE *)(ObjectType,  ObjectType, void * _Nullable))compare context:(nullable void *)context;
    
    //对当前的数组排序,使用排序算法
    - (void)sortUsingSelector:(SEL)comparator;
    
    //在指定的位置上,插入一个数组
    - (void)insertObjects:(NSArray<ObjectType> *)objects atIndexes:(NSIndexSet *)indexes;
    
    //移除制定indexes 位置上的元素
    - (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
    
    //使用一个对象数组,替换 indexes 位置上的 元素
    - (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray<ObjectType> *)objects;
    
    //替换对应索引位置的元素(索引必须有效),支持中括号下标格式(array[index])赋值替换
    - (void)setObject:(ObjectType)obj atIndexedSubscript:(NSUInteger)idx API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));
    
    //数组排序
    - (void)sortUsingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //使用后面的元素进行排序
    - (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator NS_NOESCAPE)cmptr API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //根据文件创建数组
    - (nullable NSMutableArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
    
    //根据url创建数组
    - (nullable NSMutableArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;
    
    

    类方法:

    //初始化可变数组对象的长度,如果后面代码继续添加数组超过长度以后长度会自动扩充(NSUInteger代表了开辟内存的一个单位)
    + (instancetype)arrayWithCapacity:(NSUInteger)numItems;
    
    //根据文件获取数组信息
    + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
    
    //根据url地址获取数组信息
    + (nullable NSMutableArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
    
    

    相关文章

      网友评论

          本文标题:OC集合类之NSArray、NSMutableArray(一)

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