NSArray類簡介
- 有序且只可以存儲Objective-C對象的數(shù)組
- 初始化后,內(nèi)容不可變,長度也不可變,不能進(jìn)行增、刪、改操作
- 不能存放nil (nil是標(biāo)志數(shù)組的結(jié)束)
- 在MRC模式下,會發(fā)送retain消息于每個加入數(shù)組中的元素都進(jìn)行保持,數(shù)組被釋放的時候會發(fā)送release消息
屬性表(@property)
| @property | 描述 |
|---|---|
| @property(readonly) NSUInteger count | 數(shù)組元素的個數(shù) |
| @property(nonatomic, readonly) ObjectType firstObject | 返回數(shù)組中的第一個元素 |
| @property(nonatomic, readonly) ObjectType lastObject | 返回數(shù)組中的最后一個元素 |
| @property(readonly, copy) NSData *sortedArrayHint | 用于排序 |
| @property(readonly, copy) NSString *description | 返回數(shù)組的內(nèi)容“(內(nèi)容在這)” |
常用方法
常用類方法
數(shù)組對象的生成
+ (instancetype)array // 生成并返回一個空的數(shù)組對象
+ (instancetype)arrayWithObject:(ObjectType)anObject // 返回一個只有anObject的數(shù)組對象
常用實例方法
數(shù)組對象的初始化
- (instancetype)initWithObjects:(ObjectType)firstObj, ... //返回以firstObj等元素生成的數(shù)組,以nil結(jié)束
便利構(gòu)造器:arrayWithObjects:
- (instancetype)initWithObjects:(const ObjectType _Nonnull[])objects count:(NSUInteger)count //返回包含前count個objects的數(shù)組
便利構(gòu)造器:arrayWithObjects:count:
- (instancetype)initWithArray:(NSArray<ObjectType> *)anArray //使用anArray來生成一個新的數(shù)組
便利構(gòu)造器:arrayWithArray:
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag //falg為YES的時候,底層會使用copyWithZone:方法為每個array元素生成一個副本,并把新生成的副本數(shù)組返回
數(shù)組元素的訪問
- (NSUInteger) count //返回元素數(shù)量
- (NSUInteger)indexOfObject:(ObjectType)anObject //返回數(shù)組中元素為anObject的最小的下標(biāo)(利用isEqual:方法進(jìn)行比較)
- (BOOL)containsObject:(ObjectType)anObject //判斷數(shù)組中是否有anObject元素,如果沒有就返回NSNotFound(宏定義,就是沒有找到的意思)
- (ObjectType)objectAtIndex:(NSUInteger)index //返回下標(biāo)對應(yīng)的元素(index大于數(shù)組的count時就發(fā)生NSRangeException異常)
@property(nonatomic, readonly) ObjectType lastObject //返回數(shù)組中的最后一個元素,如果沒有接收者(就是沒有取值操作)就返回nil
- (void)getObjects:(ObjectType _Nonnull [])aBuffer range:(NSRange)aRange //根據(jù)aRange指定的范圍復(fù)制數(shù)組元素到C語言的aBuffer緩沖區(qū)中(aBuffer可以通過malloc進(jìn)行創(chuàng)建)
- (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range //返回根據(jù)aRange指定的范圍從原數(shù)組中生成一個新的數(shù)組
數(shù)組元素的比較
- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray //判斷兩個數(shù)組的元素是否一致(相同下標(biāo)所對應(yīng)的元素要相等)
- (ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray //返回消息接收者與otherArray第一個相同的元素
添加新元素到數(shù)組(間接添加,返回一個新數(shù)組)
- (NSArray<ObjectType> *)arrayByAddingObject(ObjectType)anObject //返回一個由消息接收者和anObject共同組成的新數(shù)組(anObject加到新數(shù)組的末尾)
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray //返回一個由消息接收者和otherArray共同組成的新數(shù)組(otherArray加到新數(shù)組的末尾)
數(shù)組元素的排序
- (NSArray<ObjectType> *)sortedArrayUsingSelector:
(SEL)comparator //使用指定方法comparator(可以自定義,也可以使用對象本身擁有的方法;要求必須要有一個參數(shù),且其返回值必須為以下三種情況中的一種:
1. NSOrderedAscending 消息接收者元素 < 形參元素
2. NSOrderedSame 消息接收者元素 == 形參元素
3. NSOrderedDescending 消息接收者元素 > 形參元素
),返回排好序的新數(shù)組
- (NSArray<ObjectType> *)sortedArrayUsingFunction:
(NSInteger (*)(ObjectType, ObjectType, void *))comparator
context:(void *)context //使用指定的comparator方法(要求必須要有三個形式參數(shù),前兩個是數(shù)組中的元素,第三個元素是自定義形參;返回值是NSComparisonResult類型(NSInteger也行),該類型的值就是前面方法中的NSOrderedSame等三者),返回一個排好序的新數(shù)組
向數(shù)組中的元素發(fā)送消息
- (void)makeObjectsPerformSelector:(SEL)aSelector //為數(shù)組中的每一個元素發(fā)送一條消息(aSelector指定的方法),從數(shù)組的第一個元素依次發(fā)送到最后一個元素為止
//注意:
// i: aSelector指定的方法不能有參數(shù)
// ii: 指定的方法發(fā)生波及作用(就是改變數(shù)組之類的操作)
//iii: 如果沒有指定的方法會拋出NSInvalidArgumentException異常
- (void)makeObjectsPerformSelector:(SEL)aSelector
withObject:(id)anObject //為數(shù)組中的每一個元素發(fā)送一條消息(aSelector指定的方法),從數(shù)組的第一個元素依次發(fā)送到最后一個元素為止
//注意:
// i: aSelector指定的方法只能有一個參數(shù)anObject
// ii: 指定的方法發(fā)生波及作用(就是改變數(shù)組之類的操作)
//iii: 如果沒有指定的方法會拋出NSInvalidArgumentException異常
數(shù)組的文件輸入與輸出操作
- (NSString *)description //以ASCII編碼的屬性列表格式輸出數(shù)組的元素
- (NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)aPath //根據(jù)屬性列表格式保存的文件來初始化數(shù)組,aPath指文件路徑
便利構(gòu)造器:arrayWithContentsOfFile:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag //把代表這個數(shù)組內(nèi)容的屬性列表輸出到指定的文件中,path指點生成的文件的路徑(flag是控制寫入的,如果為YES則表示完全寫入)
參考方法(NSString):writeToFile: atomically: encoding: error:
- (NSString *)componentsJoinedByString:(NSString *)separator //把數(shù)組元素(以“,”分隔的元素)自第一個元素至最后一個元素用separator連接起來形成字符串(假設(shè)separatoro "-"即:firstObject-SecondObject...-LastObject)
- (NSArray<NSString *> *)pathsMatchingExtensions:(NSArray<NSString *> *)filterTypes //篩選具有特定擴展名的字符串,如:“.jpg”
數(shù)組的遍歷
- (NSEnumerator<ObjectType> *)objectEnumerator //返回一個枚舉器,用于遍歷數(shù)組
數(shù)組,小試牛刀
//Xcode 7.2
#import <Foundation/Foundation.h>
@interface msgTest : NSObject
- (void)test;
- (void)oneTest:(NSNumber *)num;
@end
@implementation msgTest
- (void)test{
NSLog(@"7 --> I am a msgTest class!");
}
- (void)oneTest:(NSNumber *)num{
NSLog(@"7 --> num = %d", [num intValue]);
}
@end
//官方Demo
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 NSOrderedDescending;
else
return NSOrderedSame;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.數(shù)組對象的生成
//1.1 //返回空的數(shù)組對象
NSArray *arry1_1 = [NSArray array];
NSLog(@"arry1_1 --> %@",arry1_1); //打印對象的內(nèi)容,返回一個字符串“( 內(nèi)容在這 )”
//1.2 返回一個只有 @"你好!數(shù)組!" 元素的數(shù)組
NSArray *arry1_2 = [NSArray arrayWithObject:@"你好!數(shù)組!"];
NSLog(@"arry1_2 --> %@",[arry1_2 description]);
//2.數(shù)組對象的初始化
//2.1 返回一個以@[@"-1-",@"-2-",@"-3-"] - @[@1,@2,@3]為基礎(chǔ)逐一創(chuàng)建的,“-1-” - 1,“-2-” - 2,“-3-” - 3共三條詞條的詞典對象
NSArray *arry2_1 = [[NSArray alloc] initWithObjects:@3,@[@"oneObject",@"twoObject"], nil];
NSLog(@"arry2_1 --> %@",arry2_1);
//2.2 IOS 9.1可以用,但I(xiàn)OS 9.2 不可以了
// NSArray *arry2_2 = [[NSArray alloc] initWithObjects:(const id _Nonnull __unsafe_unretained *) count:(NSUInteger)]
//2.3 根據(jù)arry2_1數(shù)組生成arry2_3
NSArray *arry2_3 = [[NSArray alloc] initWithArray:arry2_1];
NSLog(@"arry2_3 --> %@",arry2_3);
//2.4 copeItem值為YES的時候會以arry為藍(lán)本生成一個副本返回組arry2_4
NSArray *arry = @[@"1", @"2", @"3", @"4"];
NSArray *arry2_4 = [[NSArray alloc] initWithArray:arry copyItems:YES];
NSLog(@"arry2_4 --> %@",arry2_4);
//3.數(shù)組對象的訪問--------------=====
NSArray *arry3 = @[@1,@2,@3,@"4",@[@"1",@"2",@YES],@2.0f];//快速生成數(shù)組,只能用在NSArray處,因為生成的數(shù)組是不可變的
//3.1 元素的數(shù)量
NSLog(@"arry3 --> %@,詞條數(shù):%lu",arry3, [arry3 count]);
//3.2 通過 object 獲取相應(yīng)的 index
NSLog(@"arry3 --> %lu", [arry3 indexOfObject:@2]);
NSLog(@"arry3 --> %lu", [arry3 indexOfObject:@YES]);
//3.3 根據(jù) index 獲取相應(yīng)的 object
NSString *str = [arry3 objectAtIndex:3];
NSArray *arryTemp = [arry3 objectAtIndex:4];
NSLog(@"str = %@, arryTemp = %@", str, arryTemp);
//3.4 獲取數(shù)組中的第一個元素和最后一個元素 [NSNumber intValue] @property屬性
NSLog(@"firstObject = %d, lastObject = %@", [[arry3 firstObject] intValue], [arry3 lastObject]);
//3.5 復(fù)制在原數(shù)組一個 aRange 范圍的元素到一個C語言緩沖區(qū),并返回由這些元素組成的一個新的數(shù)組
//arry3 getObjects:(__unsafe_unretained id _Nonnull *) range:(NSRange)
// 官方Demo,ARC模式下用不了
// NSArray *mArray = arry3;// an array with at least six elements...;
// id *cObject;
//
// NSRange range = NSMakeRange(2, 4);
// cObject = malloc(sizeof(id) * range.length);
//
// [mArray getObjects:cObject range:range];
//
// for (int i = 0; i < range.length; i++) {
// NSLog(@"objects: %@", cObject[i]);
// }
// free(cObject);
//3.6 抽取原數(shù)組中 range 范圍的元素并以此生成一個新的數(shù)組并返回
NSRange range; //創(chuàng)建一個 range 結(jié)構(gòu)體
range.location = 2;
range.length = 2;
NSArray *arryOfArange = [arry3 subarrayWithRange:range];
NSLog(@"arryOfArange = %@", arryOfArange);
//4.數(shù)組元素的比較
NSArray *arry4_1 = @[@1, @2, @3];
NSArray *arry4_2 = @[@1, @2, @3];
NSArray *arry4_3 = @[@2, @1];
NSArray *arry4_4 = @[@4, @2, @3,@1];
//4.1 兩個數(shù)組元素完全一樣才會返回YES
[arry4_1 isEqualToArray:arry4_2] ? NSLog(@"arry4_1 & arry4_2: YES"): NSLog(@"arry4_1 & arry4_2: NO");
[arry4_1 isEqualToArray:arry4_3] ? NSLog(@"arry4_1 & arry4_3: YES"): NSLog(@"arry4_1 & arry4_3: NO");
[arry4_3 isEqualToArray:arry4_4] ? NSLog(@"arry4_3 & arry4_4: YES"): NSLog(@"arry4_3 & arry4_4: NO");
//4.2 返回兩個數(shù)組中第一個相同的元素
NSLog(@"arry4_1 & arry4_2 : %@", [arry4_1 firstObjectCommonWithArray:arry4_2]); //只返回index為 0 的元素 @1
NSLog(@"arry4_1 & arry4_3 : %@", [arry4_1 firstObjectCommonWithArray:arry4_3]); //只返回index為 1 的元素 @1
NSLog(@"arry4_3 & arry4_4 : %@", [arry4_3 firstObjectCommonWithArray:arry4_4]); //只返回index為 1 的元素 @2
//5.向數(shù)組中增加元素
NSArray *arry5 = [NSArray arrayWithObjects:@1,@2,@3,@4,nil];
//5.1 返回一個由消息接收者和anObject共同組成的新數(shù)組(anObject加到新數(shù)組的末尾)
NSLog(@"arry5 & object = %@", [arry5 arrayByAddingObject:@5]);
//5.2 返回一個由消息接收者和otherArray共同組成的新數(shù)組(otherArray加到新數(shù)組的末尾)
NSLog(@"arry5 & arry %@", [arry5 arrayByAddingObjectsFromArray:@[@"one",@"two"]]);
//6.數(shù)組的排序
NSArray *arryString = @[@"man",@"woman",@"cat",@"dog",@"fish"];
NSArray *arryNumber = @[@5,@2,@8,@61,@1,@13];
// 6.1 使用指定方法comparator(可以自定義,也可以使用對象本身擁有的方法),返回排好序的新數(shù)組,要求:
// (1).必須要有一個參數(shù)
// (2).返回值必須為以下三種情況中的一種:
// 1). NSOrderedAscending 消息接收者元素 < 形參元素
// 2). NSOrderedSame 消息接收者元素 == 形參元素
// 3). NSOrderedDescending 消息接收者元素 > 形參元素
//使用 NSString 自帶的 compare: 方法
NSArray *sortedStringArray = [arryString sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"sortedStringArray : %@", sortedStringArray);
//6.2 使用指定的comparator方法,返回一個排好序的新數(shù)組,要求:
// 1).必須要有三個形式參數(shù),前兩個是數(shù)組中的元素,第三個元素是自定義形參;
// 2).返回值是NSComparisonResult類型(NSInteger也行),該類型的值就是前面方法中的NSOrderedSame等三者)
//應(yīng)用于基本數(shù)據(jù)類型
NSArray *sortedNumberArray = [arryNumber sortedArrayUsingFunction:intSort context:nil];
NSLog(@"sortedNumberArray : %@", sortedNumberArray);
//7.給數(shù)組中的元素發(fā)送消息
msgTest *test1 = [[msgTest alloc] init];
msgTest *test2 = [[msgTest alloc] init];
msgTest *test3 = [[msgTest alloc] init];
NSArray *arryPerforms = @[test1, test2, test3];
//7.1 為數(shù)組中的每一個元素發(fā)送一條消息(aSelector指定的方法),從數(shù)組的第一個元素依次發(fā)送到最后一個元素為止
//注意:
// i: aSelector指定的方法不能有參數(shù)
// ii: 指定的方法發(fā)生波及作用(就是改變數(shù)組之類的操作)
//iii: 如果沒有指定的方法會拋出NSInvalidArgumentException異常
[arryPerforms makeObjectsPerformSelector:@selector(test)];
//7.2 為數(shù)組中的每一個元素發(fā)送一條消息(aSelector指定的方法),從數(shù)組的第一個元素依次發(fā)送到最后一個元素為止
//注意:
// i: aSelector指定的方法只能有一個參數(shù)anObject
// ii: 指定的方法發(fā)生波及作用(就是改變數(shù)組之類的操作)
//iii: 如果沒有指定的方法會拋出NSInvalidArgumentException異常
[arryPerforms makeObjectsPerformSelector:@selector(oneTest:) withObject:@7];
//8.數(shù)組對象與文件操作
//8.1 根據(jù)plist文件來創(chuàng)建數(shù)組
NSArray *arry8_1 = [NSArray arrayWithContentsOfFile:@"/Users/windy/Desktop/OC pros/NSArrayTest/NSArrayTest/arry8.plist"];
NSLog(@"arry8_1 --> %@", [arry8_1 description]);
//8.2 把數(shù)組元素寫進(jìn)文件
NSArray *arry8_2 = @[@"你", @[@"love",@"someone"], @"好"];
[arry8_2 writeToFile:@"/Users/windy/Desktop/OC pros/NSArrayTest/NSArrayTest/arry8_2.plist" atomically:YES];
//8.3 把數(shù)組元素(以“,”分隔的元素)自第一個元素至最后一個元素用separator連接起來形成字符串
//假設(shè)separatoro "-"即:firstObject-SecondObject...-LastObject
NSString *strTemp = [arry8_2 componentsJoinedByString:@"?"];
NSLog(@"strTemp --> %@", strTemp);
//8.4 篩選具有特定擴展名的字符串,如:“jpg”等它會自動根據(jù)擴展名進(jìn)行查找不能用“.jpg”
NSArray *arry8_4 = @[@"c.jpg",@"jpg",@"card",@"A.jpg",@"car2.jpg"];
NSArray *fliterArray = [arry8_4 pathsMatchingExtensions:[NSArray arrayWithObject:@"jpg"]];
NSLog(@"fliterArray : %@", fliterArray);
NSArray *arry8_5 = @[@"t.tif",@"c.jpg",@"ee.jpg",@"card",@"A.jpg",@"car2.jpg",@"2.png",@"a.png",@"tt.doc",@"doc",@"y.tif"];
NSArray *fliterArray2 = [arry8_5 pathsMatchingExtensions:[NSArray arrayWithObjects:@".jpg",@"png",@"doc",@"tif",nil]];
NSLog(@"fliterArray2 : %@", fliterArray2);
}
//9.數(shù)組元素的遍歷(block)
NSArray *arry9 = [NSArray arrayWithObjects:@1,@2,@3,nil];
[arry9 enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (idx == 1) {
*stop = YES;//stop是停止判斷條件
}
//obj指代數(shù)組中的元素,如:@1
NSLog(@"%d", [obj intValue]);
}];
return 0;
}