继承自 | NSObject |
符合 | NSCoding NSMutableCoding NSFastEnumeration NSSecureCoding NSObject(NSObject) |
框架 | /System/Library/Frameworks/Foundation.framework |
可用性 | 可用于iOS 2.0或者更晚的版本 |
声明于 | Foundation/NSArray.h Foundation/NSKeyValueCoding.h Foundation/NSKeyValueObserving.h Foundation/NSPathUtilities.h Foundation/NSPredicate.h Foundation/NSSortDescriptor.h |
参考之南 | Collections Programming Topics |
示例代码 | AdvancedURLConnections AVPlayerDemo CoreTextPageViewer DrillDownSave TableViewSuite |
NSArray及其子类NSMutableArray管理的对象的有序集合叫做数组。NSArray创建的是静态数组,NSMutableArray创建的是动态数组。当你需要一个对象的有序集合时,你就可以使用数组。
NSArray与其对应的Core Foundation类之间是“免费桥接”的。“免费桥接”的更多信息请参考“Toll-Free Bridging”。
子类注意事项
通常情况下是不需要子类的。它已经做得很好了—维护一个对象的有序集合。但是,也有一些情况下,自定义的数组会派上用场。以下是一些可能的情况:
更改集合中元素的存储方式。你这么做可能是因为性能方面的原因,或者是为了代码方面更好地兼容性。 |
获取集合中发生的事情的更多信息。(比如搜集统计)。 |
重写的方法
所有的NSArray的子类必须重写原始的实例方法count和objectAtIndex:。这些方法必须可以对你集合中的元素进行存储备份操作。对于存储备份,你可以使用一个静态数组,一个标准的NSArray对象,或者一些其他的类型或机制。你也可以选择重写部分或者全部任何其他的NSArray方法以提供一个你想要的另一种方式的实现。
你也许会想要为子类实现一个适合存储备份的初始化方法以管理这个子类。NSArray类并没有这样一个特定的初始化方法,因此你的初始化方法仅仅需要调用父类的init方法就可以了。NSArray类采用了NSCopying,NSMutableCopying和NSCoding协议;如果你想要从copying和coding实例化你自定义的子类,重写这些协议里的方法。
要记住NSArray是一个类簇的公有接口以及这对你的子类意味着什么。NSArray类原始的方法不包括任何特定的初始化方法。这意味着你必须提供子类的存储,并实现直接用于该存储的原始方法。
特别注意
大多数情况下,你自定义的NSArray类应该符合Cocoa的对象所有权规定。因此,你必须发送retain到你添加到集合中的每个对象,发送release给你移除出集合的每个对象。当然,如果你继承NSArray的原因是为了实现一个与标准不同的对象保留行为(比如,一个没有引用计数的数组),你可以忽略这个要求。
子类的替代品
在制作一个自定义的NSArray类之前,查看NSPointerArray和相应地Core Foundation类型以及CFArray参考指南。因为NSArray和CFArray是“toll-free bridged”的,你可以在代码中相互替换NSArray和CFArray(通过适当的转换)。尽管它们是相对应的类型,NSArray和CFArray没有相同的接口和实现,你有时可以在CFArray中做的事情不能很容易的在NSArray中做出来。比如,CFArray提供了一组回调,其中一些可以实现自定义的retain-release行为。如果你为这些回调指定一个空实现,你可以很容易地得到一个没有引用计数的数组。
如果你想要向现有的类中添加一些行为,你可以写一个NSArray的分类。要记住,这个分类将会对你所有的NSArray对象起作用,这也许会产生意想不到的后果。可选的情况下,你可以使用组合来实现这些预期的行为。
采用的协议
NSCoding | encodeWithCoder: initWithCoder: |
NSCopying | copyWithZone: |
NSMutableCopying | mutableCopyWithZone: |
NSFastEnumeration | countByEnumeratingWithState:objects:count: |
方法
类方法
创建一个数组
+ array |
创建并且返回一个空数组。
+ (id)array
参数 | |
返回值 | 一个空数组 |
论述
这个方法可用于NSArray的可变子类。
+ arrayWithArray: |
利用一个给定的数组创建并且返回一个数组。
+ (id)arrayWithArray:(NSArray *)anArray
参数 | anArray:一个数组 |
返回值 | 一个数组,包含anArray的对象 |
+ arrayWithContentsOfFile: |
利用一个给定的文件路径创建并且返回一个数组。
+ (id)arrayWithContentsOfFile:(NSString *)aPath
参数 | aPath:writeToFile:atomically:方法所产生的文件的路径 |
返回值 | 一个包含文件内容的数组,如果文件无法打开或无法解析,返回nil |
论述
表示这个数组的文件所表示的内容只能是属性列表对象(NSString,NSData,NSDate,NSNumber,NSArray或者NSDictionary对象)。要了解更多详细信息,参考Property List Programming Guide。包含在这个数组中的内容是不变的,哪怕数组是可变的。
+ arrayWithContentsOfURL: |
利用一个给定的URL创建并且返回一个数组。
+ (id)arrayWithContentsOfURL:(NSURL *)aURL
参数 | aURL:writeToURL:atomically:方法所产生的URL |
返回值 | 一个包含URL内容的数组,如果URL无法打开或无法解析,返回nil |
论述
表示这个数组的URL所表示的内容只能是属性列表对象(NSString,NSData,NSDate,NSNumber,NSArray或者NSDictionary对象)。包含在这个数组中的内容是不变的,哪怕数组是可变的。
+ arrayWithObject: |
利用一个给定的对象创建并且返回一个数组。
+ (id)arrayWithObject:(id)anObject
参数 | anObject:一个对象 |
返回值 | 一个包含单个元素anObject的数组 |
+ arrayWithObjects: |
利用一个给定的对象列表创建并且返回一个数组。
+ (id)arrayWithObjects:(id)firstObj, ...
参数 | firstObj, ...:一个以逗号分隔的对象列表,以nil结束 |
返回值 | 一个包含列表中对象的数组 |
论述
创建一个包含三个不同类型元素的数组的代码例子:
NSArray *myArray;
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";
myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];
+ arrayWithObjects:count: |
利用一个给定的C数组和一个给定的数量创建并且返回一个数组。
+ (id)arrayWithObjects:(const id[])objects count:(NSUInteger)count
参数 | objects:一个包含若干对象的C数组 count:新数组的数量,不能为负,也不能大于旧数组数量 |
返回值 | 一个新的数组,包含旧数组的部分对象 |
论述
元素添加到新数组中的顺序与它在旧数组中的顺序相同,但不包含下标计数。例如:
NSString *string[3];
string[0] = @"First";
string[0] = @"Second";
string[0] = @"Third";
NSArray *stringsArray = [NSArray arrayWithObjects:strings count:2];
// strings array contains {@"First", @"Second"}
实例方法
初始化一个数组
- initWithArray: |
通过一个给定的数组初始化一个数组。
- (id)initWithArray:(NSArray *)anArray
参数 | anArray:一个数组 |
返回值 | 一个包含anArray对象的数组,返回对象可能与原对象不同 |
论述
一个不可变的数组用这个方法初始化之后,它就不能被修改了。
- initWithArray:copyItem: |
使用一个给定的数组作为数据源初始化一个数组。
- (id)initWithArray:(NSArray *)array copyItems:(BOOL)flag
参数 | array:一个数组 |
返回值 | flag:如果值为YES,数组中的每个对象接收到一个copyWithZone:方法来拷贝对象-对象必须符合NSCopying协议。在内存管理环境中,这是替代收到retain消息。然后对象的拷贝添加到返回数组。 如果值为NO,数组中的所有对象仅仅是收到一个retain消息,然后添加到返回数组。 |
论述
一个不可变的数组用这个方法初始化之后,它就不能被修改了。
copyWithZone:方法执行一个浅拷贝。如果你有一个任意深度的集合,将flag值设为YES将会在表面下的第一层执行一个不变的拷贝。如果将flag值设为NO,第一层的可变性是不受影响的。在这两种情况下,所有更深层次的可变性都是不受影响的。
- initWithContentsOfFile: |
通过一个给定的指向数组的文件路径初始化一个数组。
- (id)initWithContentsOfFile:(NSString *)aPath
参数 | aPath:writeToFile:atomically:方法所产生的文件的路径 |
返回值 | 一个包含文件内容的数组,如果文件无法打开或无法解析,返回nil,返回的对象可能与原对象不同 |
论述
表示这个数组的文件所表示的内容只能是属性列表对象(NSString,NSData,NSDate,NSNumber,NSArray或者NSDictionary对象)。要了解更多详细信息,参考Property List Programming Guide。包含在这个数组中的内容是不变的,哪怕数组是可变的。
- initWithContentsOfURL: |
通过一个给定的指向数组的URL初始化一个数组。
- (id)initWithContentsOfURL:(NSURL *)aURL
参数 | aURL:writeToURL:atomically:方法所产生的URL |
返回值 | 一个包含URL内容的数组,如果URL无法打开或无法解析,返回nil,返回的对象可能与原对象不同 |
论述
表示这个数组的URL所表示的内容只能是属性列表对象(NSString,NSData,NSDate,NSNumber,NSArray或者NSDictionary对象)。包含在这个数组中的内容是不变的,哪怕数组是可变的。
- initWithObjects: |
通过一个给定的对象列表初始化一个数组。
- (id)initWithObjects:(id)firstObj, ...
参数 | firstObj, ...:一个以逗号分隔的对象列表,以nil结束 |
返回值 | 一个包含列表中对象的数组,返回对象可能与原对象不同 |
论述
一个不可变的数组用这个方法初始化之后,它就不能被修改了。
- initWithObjects:count: |
通过一个给定的C数组和一个给定的数量初始化一个数组。
- (id)initWithObjects:(const id[])objects count:(NSUInteger)count
参数 | objects:一个包含若干对象的C数组 count:新数组的数量,不能为负,也不能大于旧数组数量 |
返回值 | 一个包含列表中对象的数组,返回对象可能与原对象不同 |
论述
元素添加到新数组中的顺序与它在旧数组中的顺序相同,但不包含下标计数。
一个不可变的数组用这个方法初始化之后,它就不能被修改了。
查询一个数组
- containsObject: |
返回一个布尔值,判断数组是否包含某个对象。
- (BOOL)containsObject:(id)anObject
参数 | anObject:一个对象 |
返回值 | 如果数组中有这个对象则返回YES,反之返回NO |
论述
这个方法是通过想数组中每个对象发送isEqual:方法来判断对象是否在数组中。
- count |
返回数组的对象个数。
参数 | |
返回值 | 数组中对象个数 |
- getObjects:range: |
将数组内指定范围的对象返回到一个缓冲区。
- (void)getObjects:(id[])aBuffer range:(NSRange)aRange
参数 | aBuffer:一个C数组,它的大小至少是aRange的长度 aRange:一个数组的范围 如果当前下标加上范围大于数组大小,这个方法将返回一个NSRangeException。 |
返回值 |
论述
这个方法将数组的指定返回拷贝到一个缓冲区;缓冲区的大小必须至少是范围的长度乘以对象的大小,在下面的示例中所示(这完全是为了说明-你通常不应该简单的创建一个缓冲区来遍历数组的内容):
NSArray *mArray = //an array with at least siz elements...;
id *objects;
NSRange range = NSMakeRange(2, 4);
objects = malloc(sizeof(id) * range.length);
[mArray getObjects:objects range:range];
for(int i = 0; i < range.length; i++){
NSLog(@"objects:%@", objects[i]);
}
free(objects);
- lastObject |
返回数组的最后一个对象。
- (id)lastObject
参数 | |
返回值 | 数组中的最后一个对象,如果数组为空则返回nil |
- objectAtIndex: |
返回指定下标的数组对象。
- (id)objectAtIndex:(NSUInteger)index
参数 | index:指定的下标 |
返回值 | 指定下标处的对象 |
论述
如果下标超出的数组的末尾(也就是说index值大于或等于数组的count),将会得到一个NSRangeException。
- objectAtIndexdSubscript: |
返回指定下标的数组对象。
- (id)objectAtIndexdSubscript:(NSUInteger)idx
参数 | idx:指定的下标 |
返回值 | 指定下标处的对象 |
论述
如果下标超出的数组的末尾(也就是说index值大于或等于数组的count),将会得到一个NSRangeException。
这个方法与objectAtIndex:方法是等效的。
- objectsAtIndexes: |
返回一个数组,包含了指定下标集合的对象。
- (NSArray *)objectsAtIndexes:(NSInedsSet *)indexes
参数 | indexes:下标的集合 |
返回值 | 指定下标集合的对象 |
论述
返回的对象在indexes中实升序的,所有返回的数组高的下标是跟着低的下标的。
- objectEnumerator |
返回一个枚举对象,让你可以访问数组中的每个对象。
- (NSEnumerator *)objectEnumerator
参数 | |
返回值 | 一个对象枚举,让你以下标升序的方式遍历数组 |
论述
一个对象枚举,让你以下标升序的方式遍历数组,从下标0开始,如下所示:
NSEnumerator *enumerator = [myArray objectEnumerator];
id anObject;
while(anObject = [enumerator nextObject]){
/* code to act on each element as it is returned */
}
特别注意
当你对可变数组使用这个方法,在枚举过程中你不能修改数组。
这是更有效地使用枚举协议(查看NSFastEnumeration)。快速枚举在OS X v10.5和iOS 2.0或以后可以用。
- reverseObjectEnumerator |
以相反的顺序返回一个枚举对象,让你可以访问数组中的每个对象。
- (NSEnumerator *)reverseObjectEnumerator
一个对象枚举,让你以下标升序的方式遍历数组。
特别注意
当你对可变数组使用这个方法,在枚举过程中你不能修改数组。
这是更有效地使用枚举协议(查看NSFastEnumeration)。快速枚举在OS X v10.5和iOS 2.0或以后可以用。
- getObjects: |
将数组中所有的对象拷贝到一个缓冲区。(在iOS 4.0时过期,使用getObject:range:替代)。
- (void)getObjects:(id[])aBuffer
参数 | |
返回值 | 一个C数组,大小至少是原数组的大小 |
论述
这个方法将数组的所有对象拷贝的一个缓冲区;缓冲区的大小至少是对象的大小乘以原数组的个数,在下面的示例中所示(注意这仅仅是一个例子,你通常不应该简单的创建一个缓冲区来遍历数组的内容)
NSArray *mArray = //an array with at least siz elements...;
id *objects;
NSUInteger count = [mArray count];
objects = malloc(sizeof(id) * count);
[mArray getObjects:objects range:range];
for(int i = 0; i < count; i++){
NSLog(@"objects:%@", objects[i]);
}
free(objects);
特别注意
这个方法是不安全的,因为它可能导致缓冲区溢出。
查找数组中的对象
- indexOfObject: |
返回与给定对象的值相同的对象的最低的索引。
- (NSUInteger)indexOfObject:(id)anObject
参数 | anObject:一个对象 |
返回值 | 与给定对象值相同的最低的索引,如果找不到则返回NSNotFound |
论述
从索引0开始,向数组中每个元素发送isEqual:消息,直到找到或者到达数组末尾。如果isEqual:方法返回YES,那么认为两个对象是相等的。
- indexOfObject:inRange: |
返回与在给定范围内与给定对象的值相同的对象的最低的索引。
- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range
参数 | anObject:一个对象 range:给定的索引范围 |
返回值 | 给定索引范围内与给定对象值相同的最低的索引,如果找不到则返回NSNotFound |
论述
从索引0开始,向数组中每个元素发送isEqual:消息,直到找到或者到达数组末尾。如果isEqual:方法返回YES,那么认为两个对象是相等的。
如果给定的范围不在数组范围内,该方法会引发一个NSRangeException异常。
- indexOfObjectIdenticalTo: |
返回与给定对象的值相同的相应的数组的值的最低的索引。
- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject
参数 | anObject:一个对象 |
返回值 | 相应数组的值与anObject相同的最低的索引,如果找不到则返回NSNotFound |
论述
如果对象的地址是相同的,那么认为两个对象是相同的。
- indexOfObjectIdentcalTo:inRange: |
返回与在给定范围内与给定对象的值相同的相应的数组的值的最低的索引。
- (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range
参数 | anObject:一个对象 range:给定的索引的范围 |
返回值 | 给定范围内相应的数组的值与anObject相同的最低的索引,如果找不到则返回NSNotFound |
论述
如果对象的地址是相同的,那么认为两个对象是相同的。
- indexOfObjectPassingTest: |
返回通过给定block测试的第一个对象的索引。
- (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
参数 | predicate:block断言 block: obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 | 通过给定block测试的最低的对象的索引,如果没有对象通过block则返回NSNotFound |
论述
如果block参数为nil,该方法将会引发一个异常。
- indexOfObjectWithOptions:passingTest: |
返回一个对于一个给定的枚举通过给定的block测试的对象的索引。
- (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
参数 | opts:一个指定枚举的位掩码(是否同时执行,是否反序执行) predicate:block断言 block: obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 | 通过指定的predicate和opts测试的相应的值的索引。如果位掩码指定为反序,那么返回匹配的最后一项。否则返回第一项。如果没有对象通过测试则返回NSNotFound |
论述
默认情况下,枚举从第一个到最后一个。你可以通过指定NSEumerationConcurrent以及NSEumerationReverse来修改这个行为。
如果block参数为nil,该方法将会引发一个异常。
- indexesOfObjectsPassingTest: |
返回通过给定block测试的所有的对象的索引。
- (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
参数 | predicate:block断言 block: obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 | 通过给定block测试的所有的对象的索引,如果没有对象通过block则返回空索引集合。 |
- indexesOfObjectsWithOptions:passingTest: |
返回对于一个给定的枚举通过给定block测试的所有的对象的索引。
- (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
参数 | opts:一个指定枚举的位掩码(是否同时执行,是否反序执行) predicate:block断言 block: obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 | 通过指定的predicate和opts测试的相应的值的所有的索引。如果位掩码指定为反序,那么返回匹配的最后一项。否则返回第一项。如果没有对象通过测试则返回空索引集合 |
- indexesOfObjectsAtIndexes:options:passingTest: |
返回对于给定索引的对象,对于一个给定的枚举通过给定block测试的所有的对象的索引。
- (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))predicate
参数 | indexSet:枚举的对象的索引 opts:一个指定枚举的位掩码(是否同时执行,是否反序执行) predicate:block断言 block: obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 | 指定索引内通过指定的predicate和opts测试的相应的值的所有的索引。如果位掩码指定为反序,那么返回匹配的最后一项。否则返回第一项。如果没有对象通过测试则返回空索引集合 |
论述
默认情况下,枚举从第一个到最后一个。你可以通过指定NSEumerationConcurrent以及NSEumerationReverse来修改这个行为。
如果block参数为nil,该方法将会引发一个异常。
- indexOfObject:inSortedRange:options:usingComparator: |
返回在指定返回内通过给定的NSComparator block的对象的索引。
- (NSUInteger)indexOfObject:(id)obj inSortedRange:(NSRange)r options:(NSBinarySerchingOptions)opts usingComparator:(NSComparator)cmp
参数 | obj:要查找的对象,如果为nil则抛出NSInvalidArgumentException r:查找的范围,如果范围越界则抛出NSRangeException opts:查找选项。详细参考"NSBinarySerchingOptions"。如果同时指定NSBinarySerchingFirstEqual和NSBinarySerchingLastEqual则抛出NSInvalidArgumentException cmp:一个比较block,如果为NULL抛出NSInvalidArgumentException |
返回值 | 如果搜索选项没有指定为NSBinarySerchingInsertionIndex: 1.对象找到了并且既没有指定NSBinarySerchingFirstEqual也没有指定NSBinarySerchingLastEqual,那么返回任意一个符合的对象索引 2.如果指定了NSBinarySerchingFirstEqual,返回最低的索引 3.如果指定了NSBinarySerchingLastEqual,返回最高的索引 4.如果没有找到,返回NSNotFound 如果搜索选项指定为NSBinarySerchingInsertionIndex: 1.对象找到了并且既没有指定NSBinarySerchingFirstEqual也没有指定NSBinarySerchingLastEqual,返回一个等于或者大于任意对象索引的索引 2.如果指定了NSBinarySerchingFirstEqual,返回最低的索引 3.如果指定了NSBinarySerchingLastEqual,返回最高的索引 4.如果没有找到,返回至少大于对象索引的索引或者如果对象的索引大于所有元素的索引则返回最后的索引 |
特别注意
数组中的元素必须已经使用cmp排序。如果数组没有排序,结果是不确定的。
发送消息给元素
- makeObjectsPerformSelector: |
通过一个给定的选择器从头到尾依次向数组中元素发送消息。
-- (void)makeObjectsPerformSelector:(SEL)aSelector
参数 | aSelector:确定消息的选择器。该方法不能带参数,而且不能有修改接收数组的副作用 |
返回值 |
论述
如果选择器为NULL,该方法引发一个NSInvalidArgumentException。
- makeObjectsPerformSelector:withObject: |
通过一个给定的选择器从头到尾依次向数组中元素发送消息。
- (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)anObject
参数 | aSelector:确定消息的选择器。该方法不能带参数,而且不能有修改接收数组的副作用 anObject:选择器调用的参数 |
返回值 |
论述
如果选择器为NULL,该方法引发一个NSInvalidArgumentException。
- enumerateObjectsUsingBlock: |
数组中的元素从头到尾依次执行给定的block。
- (void)enumerateObjectsUsingBlock:(void(^)(id obj, NSUInteger idx, BOOL *stop))block
参数 | block:数组元素使用的block obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 |
论述
如果block为nil,该方法会引发一个异常。
- enumerateObjectsWithOptions:usingBlock: |
数组中的元素执行给定的block。
- enumerateObjectsAtIndexed:options:usingBlock |
数组中指定索引的元素执行一个给定的block。
- (void)enumerateObjectsAtIndexed:(NSIndexSet *)indexSet options:(NSEnumerationOptions)opts usingBlock:(void(^)(id obj, NSUInteger idx, BOOL *stop))block
参数 | indexSet:枚举的对象的索引 opts:一个指定枚举的位掩码(是否同时执行,是否反序执行) block:数组元素使用的block obj:数组中元素 idx:元素的索引 stop:一个布尔指针。可以将该值设为YES,来停止数组继续处理。这个参数是一个只出参数。你应该只将该值设为YES |
返回值 |
论述
默认情况下,枚举从第一个到最后一个。你可以通过指定NSEumerationConcurrent以及NSEumerationReverse来修改这个行为。
如果block参数为nil,该方法将会引发一个异常。
比较数组
- firstObjectCommonWithArray: |
返回接收数组的第一个对象,这个对象与另一个给定的数组中的一个对象相等。
- (id)firstObjectCommonWithArray:(NSArray *)otherArray
参数 | otherArray:一个数组 |
返回值 | 返回接收数组的第一个对象,这个对象与另一个给定的数组中的一个对象相等。如果找不到则返回nil |
论述
该方法使用isEqual:方法来检查对象是否相等。
- isEqualToArray: |
比较接收数组和另一个数组。
- (BOOL)isEqualToArray:(NSArray *)otherArray
参数 | otherArray:一个数组 |
返回值 | 相等返回YES,不相等返回NO |
论述
要判断两个数组是否相等,首先两个数组的对象数量相等,其次每个索引处的对象相等。
派生新数组
- arrayByAddingObject: |
返回一个原数组末尾添加一个对象的拷贝。
- (NSArray *)arrayByAddingObject:(id)anObject
参数 | anObject:一个对象 |
返回值 | 一个新数组 |
论述
如果anObject为nil,则引发NSInvalidArgumentException。
- arrayByAddingObjectsFromArray: |
返回一个原数组末尾添加一个数组的拷贝。
- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray
参数 | otherArray:一个数组 |
返回值 | 一个新数组 |
- filteredArrayUsingPredicate: |
对原数组中每个元素计算断言,返回的数组包含了断言为true的元素。
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate
参数 | predicate:一个断言 |
返回值 | 一个新数组 |
论述
更多信息,请参考Predicate Programming Guide。
- subarrayWithRange: |
返回一个原数组指定范围元素的数组拷贝。
- (NSArray *)subarrayWithRange:(NSRange *)range
参数 | range:一个范围 |
返回值 | 一个新数组 |
论述
如果range越界,则引发NSRangeException。
例如,下面的代码例子创建了一个包含数组前半部分发现的元素(假设数组存在)。
NSArray *halfArray;
NSRange theRange;
theRange.location = 0;
theRange.length = [wholeArray count] / 2;
halfArray = [wholeArray subarrayWithRange: theRange];
排序
- sortedArrayHint |
返回一个加快数组排序的提示,这个提示提供给sortedArrayUsingFunction:context:hint:方法。
- (NSData *)sortedArrayHint
- sortedArrayUsingFunction:context: |
返回一个使用比较函数对所有元素进行排序的新数组。
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context
论述
新数组包含给定数组元素的引用,而不是拷贝他们。
比较函数是用来比较同一时间的两个元素,如果第一个元素比第二个小则返回NSOrderedAscending,如果第一个元素比第二个大则返回NSOrderedDescending,如果两个元素相等则返回NSOrderedSame。比较函数每次被调用时,它的上下文作为它的第三个参数。这允许根据一些外部参数做比较,比如字符排序是否区分大小写。
下面代码是一个数组(NSNumber对象的数组)和一个比较函数:
NSInteger intSort(id num1, id num2, void *context)
{
int v1 = [num1 intValue];
int v2 = [num2 intValue];
if(v1 < v2){
return NSOrderedAscending;
}else if(v1 > v2){
return NSOrderedDesceding;
}else{
return NSOrderedSame;
}
}
anArray的排序版本是以这种方式创建的:
NSArray *sortedArray;
sortedArray = [anArray sortedArrayUsingFunction:intSort context:NULL];
- sortedArrayUsingFunction:context:hint: |
返回一个使用比较函数对所有元素进行排序的新数组。
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context hint:(NSData *)hint
论述
新数组包含给定数组元素的引用,而不是拷贝他们。
这个方法与sortedArrayUsingFunction:context:方法相似,特殊的地方是它使用一个提示来加快排序过程。当你知道数组已经接近有序,这个方法会比sortedArrayUsingFunction:context:方法更快。如果你对一个大数组(N个)排序一次,而且你对它的改变不大(P个添加和删除,P远小于N),那么你可以在原来的排序上概念上重复这个工作,在N个旧值和P个新值之间做一个合并排序。
要获得适当的提示,使用sortedArrayHint方法。你应该在原始数组排序完成时获得这个提示,并且在数组被修改之前保存下来以备后用。这个提示是通过sortedArrayHint方法复杂度为O(N)(N为数组的元素个数)个值得出的。这是假设数组中的元素实现一个哈希方法。给定一个合适的提示,并且假设这个哈希方法是一个好的散列方法,sortedArrayUsingFunction:context:hint:方法的复杂度为O(P*LOG(P)+N),P是要添加或删除的元素个数。当P很小时,这个方法相对于没有提示的方法(O(N*LOG(N)))是一个改进。
提示仅仅是一个大小为N包括N的哈希数组。要重新排序你需要创建一个哈希表,映射哈希值到索引。在新数组使用这个哈希表,你可以得到一个第一预期,然后对它进行排序。例如,一个数组{A,B,D,E,F}和相应的哈希值{25,96,78,32,17},可能会受到微小的变化结果为{E,A,C,B,F}。哈希表将哈希值映射为指数{#0,#1,#2,#3,#4},所以创建一个初始的半排序数组{A,B,E,F},然后对{C}进行合并排序编程{E,A,C,B,F}。
- sortedArrayUsingDescriptors: |
返回一个经过给定的数组排序描述排序过得新数组。
- (NSArray *)sortedArrayUsingDescriptors:(NSArray *)sortDescriptors
参数 | sortDescriptors:一个NSSortDescriptor对象的数组 |
返回值 | 经过指定的sortDescriptors排序过的数组拷贝 |
论述
第一个描述指定了用在排序数组中的主键路径。其余的描述用于进一步细化对象的排序。更多信息请参考NSSortDescriptor。
- sortedArrayUsingSelector: |
返回一个使用给定的选择器对所有元素进行排序的新数组。
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator
参数 | comparator:一个定义了比较方法的选择器。如果第一个元素小于第二个元素则返回NSOrderedAscending,如果第一个元素大于第二 个元素则返回NSOrderedDescending,如果两个元素相等则返回 NSOrderedSame |
返回值 | 一个升序的数组,比较的方法由选择器的比较方法决定 |
论述
新数组包含给定数组元素的引用,而不是拷贝他们。
比较消息发送到每个对象,并作为另一个对象的的单个参数。
例如,一个NSString的数组可以用定义在NSString类中的caseInsensitiveCompare:方法排序。假设anArray存在,可以用这种方式创建一个已排序的数组版本:
NSArray *sortedArray = [anArray sortArrayUsingSelector:@selector(caseInsensitiveCompare:)];
- sortedArrayUsingComparator: |
返回一个使用给定的NSComparator block的比较方法对所有元素进行排序的新数组。
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr
参数 | cmptr:一个比较语法块 |
返回值 | 一个升序的数组,比较的方法由比较语法块决定 |
- sortedArrayWithOptions:usingComparator: |
返回一个使用给定的NSComparator block的比较方法对所有元素进行排序的新数组。
- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr
参数 | opts:一个指定枚举的位掩码(是否同时执行,是否反序执行)cmptr:一个比较语法块 |
返回值 | 一个升序的数组,比较的方法由比较语法块决定 |
使用字符串元素
- componentsJoinedByString: |
构造并返回一个NSString对象,内容是插入一个给定数组元素之间的分隔符。
- (NSString *)componentsJoinedByString:(NSString *)separator
参数 | separator:插入到元素之间的字符串 |
返回值 | 插入一个给定数组元素之间的分隔符,如果数组为空则返回一个空字符串 |
例如,这段代码写的“here be dragons”到控制台:
NSArray *pathArray = [NSArray arrayWithObjects:@"here", @"be", @"dragons", nil];
NSLog(@"%@",[pathArray componentsJoinedByString:@" "]);
特别注意:
数组中的每个元素必须处理描述。
创建一个描述
- description |
返回一个表示数组内容的字符串,格式化为一个属性列表。
- (NSString *)description
- descriptionWithLocale: |
返回一个表示数组内容的字符串,格式化为一个属性列表。
- (NSString *)descriptionWithLocale:(id)locale
参数 | locale:一个NSLocale对象或者一个NSDictionary对象,指定了用于格式化每个数组元素的选项。如果你不想格式化数组元素,指定为nil |
返回值 | 一个表示数组内容的字符串,格式化为一个属性列表 |
论述
要知道描述如何应用于数组中的每个元素,查看descriptionWithLocale:indent:方法。
- descriptionWithLocale:indent: |
返回一个表示数组内容的字符串,格式化为一个属性列表。
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
参数 | locale:一个NSLocale对象或者一个NSDictionary对象,指定了用于格式化每个数组元素的选项。如果你不想格式化数组元素,指定为nil level:缩进等级,是输出更具可读性:设为0代表4个空格缩进,1代表1个制表符缩进 |
返回值 | 一个表示数组内容的字符串,格式化为一个属性列表 |
论述
返回的字符串从第一个到最后一个有序的包含数组中每个元素的字符串形式。为了获得给定元素的字符串形式,descriptionWithLocale:indent:方法的处理过程如下:
如果元素是一个NSString对象,它直接被使用
如果元素响应descriptionWithLocale:indent:方法,这个方法被调用的时候获得元素的字符串形式。
如果元素响应descriptionWithLocale:方法,这个方法被调用的时候获得元素的字符串形式。
如果没有满足上述条件,元素的字符串形式通过调用它的description方法获得。
- writeToFile:atomically: |
将数组内容写到一个给定的文件路径。
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag
参数 | path:文件的路径。如果路径含有(~)字符,在调用方法之前,你必须用stringByExpandingTildeInPath方法扩展它 flag:如果YES,数组写到一个辅助文件,然后辅助文件重命名为路径。如果NO,数组直接写入路径。YES选项确保路径存在,如果根本不存在,即使在写的过程中会导致crash也不会损坏 |
返回值 | 成功写入返回YES,否则返回NO |
论述
如果数组的内容都是属性列表对象(NSString,NSData,NSArray或者NSDictionary对象),用此方法写的文件可以通过使用arrayWithContentOfFile:方法或者initWithContentsOfFile:方法来初始化一个新的数组。这个方法在将对象写到文件之前递归验证文件是否是属性列表对象,如果不是则返回NO,生成的文件将不会是一个有效的文件。
- writeToURL:atomically: |
将数组内容写到一个给定的URL。
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag
参数 | aURL:数组要写入的URL flag:如果YES,数组写到一个辅助文件,然后辅助文件重命名为路径。如果NO,数组直接写入路径。YES选项确保路径存在,如果根本不存在,即使在写的过程中会导致crash也不会损坏 |
返回值 | 成功写入返回YES,否则返回NO |
论述
如果数组的内容都是属性列表对象(NSString,NSData,NSArray或者NSDictionary对象),用此方法写的文件可以通过使用arrayWithContentOfFile:方法或者initWithContentsOfFile:方法来初始化一个新的数组。
连接路径
- pathsMatchingExtensions: |
返回一个包含接收数组中所有有文件扩展名的元素的路径名数组。
- (NSArray *)pathsMatchingExtensions:(NSArray *)filterTypes
参数 | filterTypes:一个包含文件扩展名的数组,扩展名不要有‘.’字符 |
返回值 | 包含filterTypes数组中文件扩展名的路径名的数组 |
键值查看
- addObserver:forKeyPath:options:context: |
引发一个异常。
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
参数 | observer:查看KVO消息的对象,该对象必须通过observeValueForKeyPath:ofObject:change:context:方法实现 keyPath:observe对象的一个属性,对应数组的路径,不能为nil options:指定observe通知内容的NSKeyValueObservingOptions组合 context:传递到observeValueForKeyPath:ofObject:change:context:方法的任意数据 |
返回值 |
特别注意
NSArray对象不是observable的,所以当NSArray对象调用该方法的时候会抛出一个异常。观察数组中对象之间的关系来替代观察数组。
- removeObserver:forKeyPath: |
引发一个异常。
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
参数 | observer:要移除的作为观察员的对象 keyPath:对象的一个属性,对应数组的路径,不能为nil |
返回值 |
特别注意
NSArray对象不是observable的,所以当NSArray对象调用该方法的时候会抛出一个异常。观察数组中对象之间的关系来替代观察数组。
- removeObserver:forKeyPath:context: |
引发一个异常。
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context
参数 | observer:要移除的作为观察员的对象 keyPath:对象的一个属性,对应数组的路径,不能为nil context:发送到通知的内容 |
返回值 |
特别注意
NSArray对象不是observable的,所以当NSArray对象调用该方法的时候会抛出一个异常。观察数组中对象之间的关系来替代观察数组。
- removeObserver:fromObjectsAtIndexes:forKeyPath:context: |
引发一个异常。
- (void)removeObserver:(NSObject *)observer fromObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath context:(void *)context
参数 | observer:要移除的作为观察员的对象 indexes:数组下标集合 keyPath:对象的一个属性,对应数组的路径,不能为nil context:发送到通知的内容 |
返回值 |
特别注意
NSArray对象不是observable的,所以当NSArray对象调用该方法的时候会抛出一个异常。观察数组中对象之间的关系来替代观察数组。
- addObserver:toObjectsAtIndexes:forKeyPath:options:context: |
注册一个接收相应下标的 元素的键值查看消息的键值查看对象。
- (void)addObserver:(NSObject *)observer toObjectsAtIndexes:(NSIndexSet *)indexes forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
参数 | observer:要移除的作为观察员的对象 indexes:数组下标集合 keyPath:对象的一个属性,对应数组的路径 options:指定observe通知内容的NSKeyValueObservingOptions组合 context:发送到通知的内容 |
返回值 |
论述
options决定了通知中包含的内容,context是发送给通知的内容。这不仅仅是一个方便的方法;调用这个方法可以会远快于调用addObserver:forKeyPath:options:context:方法。
键值编写
- setValue:forKey: |
设置数组项的键值。
- (void)setValue:(id)vale forKey:(NSString *)key
参数 | value:对象的值 key:对应的键 |
返回值 |
- valueForKey: |
返回数组中指定键的所有值的数组。
- (id)valueForKey:(NSString *)key
参数 | key:对应的键 |
返回值 | 对应键的值 |
论述
如果所有的对象都返回nil,返回的数组包含一个NSNull元素。
常量
NSBinarySerchingOptions
使用indexOfObject:inStoredRange:options:usingComparator:方法的搜索和插入选项。
enum{
NSBinarySerchingFirstEqual = (1 << 8),
NSBinarySerchingLastEqual = (1 << 9),
NSBinarySerchingInsertionIndex = (1 << 10),
};
typedef NSUInteger NSBinarySerchingOptions;
NSBinarySerchingFirstEqual:指定搜索应该返回与给定对象相等的第一个对象。
NSBinarySerchingLastEqual:指定搜索应该返回与给定对象相等的最后一个对象。
NSBinarySerchingInsertionIndex:返回一个索引,你应该将对象插入到方便数组维持有序性的位置。