一、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;