1.NSArray的遍歷
(1)常規(guī)遍歷
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
for (int i = 0; i < arr.count; ++i) {
NSLog(@"arr[%i] = %@", i, arr[i]);
}
(2)快速遍歷
// 如果是OC數(shù)組可以使用OC中的增強(qiáng)for循環(huán)來(lái)遍歷
// 逐個(gè)取出arr中的元素, 將取出的元素賦值給obj
// 注意: obj的類(lèi)型可以根據(jù)數(shù)組中元素的類(lèi)型來(lái)寫(xiě), 不一定要寫(xiě)NSObject
for (NSString *obj in arr) {
NSLog(@"obj = %@", obj);
}
(3) 使用OC數(shù)組的迭代器來(lái)遍歷
// 使用OC數(shù)組的迭代器來(lái)遍歷
// 每取出一個(gè)元素就會(huì)調(diào)用一次block
// 每次調(diào)用block都會(huì)將當(dāng)前取出的元素和元素對(duì)應(yīng)的索引傳遞給我們
// obj就是當(dāng)前取出的元素, idx就是當(dāng)前元素對(duì)應(yīng)的索引
// stop用于控制什么時(shí)候停止遍歷
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (idx == 1) {
*stop = YES;
}
NSLog(@"obj = %@, idx = %lu", obj, idx);
}];
(4) 數(shù)組中的元素執(zhí)行方法
/*
[arr enumerateObjectsUsingBlock:^(Person *obj, NSUInteger idx, BOOL *stop) {
[obj say];
}];
*/
// 如果使用OC數(shù)組存儲(chǔ)對(duì)象, 可以調(diào)用OC數(shù)組的方法讓數(shù)組中所有的元素都執(zhí)行指定的方法
// 注意點(diǎn): 如果數(shù)組中保存的不是相同類(lèi)型的數(shù)據(jù), 并且沒(méi)有相同的方法, 那么會(huì)報(bào)錯(cuò)
// [arr makeObjectsPerformSelector:@selector(say)];
// withObject: 需要傳遞給調(diào)用方法的參數(shù)
[arr makeObjectsPerformSelector:@selector(sayWithName:) withObject:@"lnj"];
2.NSArray的排序
(1)通過(guò)compare排序
NSArray *arr = @[@10, @20, @5, @7, @15];
NSLog(@"排序前: %@", arr);
// 注意: 想使用compare方法對(duì)數(shù)組中的元素進(jìn)行排序, 那么數(shù)組中的元素必須是Foundation框架中的對(duì)象, 也就是說(shuō)不能是自定義對(duì)象
NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"排序后: %@", newArr);
(2)排序自定義對(duì)象
Person *p1 = [Person new];
p1.age = 10;
Person *p2 = [Person new];
p2.age = 20;
Person *p3 = [Person new];
p3.age = 5;
Person *p4 = [Person new];
p4.age = 7;
NSArray *arr = @[p1, p2, p3, p4];
NSLog(@"排序前: %@", arr);
// 按照人的年齡進(jìn)行排序
// 不能使用compare:方法對(duì)自定義對(duì)象進(jìn)行排序
// NSArray *newArr = [arr sortedArrayUsingSelector:@selector(compare:)];
// 該方法默認(rèn)會(huì)按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable
usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
// 每次調(diào)用該block都會(huì)取出數(shù)組中的兩個(gè)元素給我們
return obj1.age > obj2.age;
/*
if (obj1.age > obj2.age) {
// 5 4
return NSOrderedDescending;
}else if(obj1.age < obj2.age)
{
// 4 5
return NSOrderedAscending;
}else
{
return NSOrderedSame;
}
*/
}];
NSLog(@"排序后: %@", newArr);
3.NSArray和NSString之間互換
(1)遍歷拼接
// 1.定義一個(gè)可變字符串保存拼接之后的結(jié)果
NSMutableString *strM = [NSMutableString string];
// 2.遍歷數(shù)組, 取出數(shù)組中的每一個(gè)元素, 將元素添加到可變字符串中
for (NSString *str in arr) {
[strM appendString:str];
// 3.每次添加完畢之后再添加一個(gè)-
[strM appendString:@"-"];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = %@", strM);
(2)OC自帶方法
//將array數(shù)組轉(zhuǎn)換為string字符串
NSString *str = [arr componentsJoinedByString:@"**"];
NSLog(@"str = %@", str);
// 通過(guò)一個(gè)字符串生成一個(gè)數(shù)組
// 也叫做字符串切割
NSString *str = @"lnj**lmj**jjj";
NSArray *arr = [str componentsSeparatedByString:@"**"];
NSLog(@"arr = %@", arr);
4.NSArray文件讀寫(xiě)
(1) 將數(shù)組寫(xiě)入到文件中
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
// 其實(shí)如果將一個(gè)數(shù)組寫(xiě)入到文件中之后, 本質(zhì)是寫(xiě)入了一個(gè)XML文件
// 在iOS開(kāi)發(fā)中一般情況下我們會(huì)將XML文件的擴(kuò)展名保存為plist
BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES];
NSLog(@"flag = %i", flag);
// 注意:writeToFile只能寫(xiě)入數(shù)組中保存的元素都是Foundation框架中的類(lèi)創(chuàng)建的對(duì)象, 如果保存的是自定義對(duì)象那么不能寫(xiě)入
(2) 從文件中讀取一個(gè)數(shù)組
NSArray *newArray = [NSArray arrayWithContentsOfFile:@"/Users/xiaomage/Desktop/abc.plist"];
NSLog(@"%@", newArray);
5.NSArray的創(chuàng)建
// NSArray *arr = [[NSArray alloc] init];
// NSArray *arr = [NSArray arrayWithObject:@"lnj"];
// 數(shù)組中的nil是結(jié)束符
NSArray *arr = [NSArray arrayWithObjects:@"lnj", @"lmj" ,@"jjj", @"cp", nil];
NSLog(@"count = %lu", [arr count]);
NSLog(@"last = %@", [arr lastObject]);
NSLog(@"first = %@", [arr firstObject]);
NSLog(@"arr[1] = %@", [arr objectAtIndex:1]);
if([arr containsObject:@"zs"])
{
NSLog(@"arr中包含zs");
}else
{
NSLog(@"arr中不包含zs");
}