1. 程式人生 > >iOS第六課 NSArray與NSMutableArray

iOS第六課 NSArray與NSMutableArray

NSArray基本概念

什麼是NSArray

NSArray是OC中的陣列類,開發中建議儘量使用NSArray替代C語言中的陣列

NSArray有哪些使用注意

只能存放任意OC物件, 並且是有順序的
不能儲存非OC物件, 比如int\float\double\char\enum\struct等
它是不可變的,一旦初始化完畢後,它裡面的內容就永遠是固定的, 不能刪除裡面的元素, 也不能再往裡面新增元素
NSArray使用NSLog()列印,輸出的是小括號的格式。
NSArray中不能儲存nil,因為NSArray認為nil是陣列的結束(nil是陣列元素結束的標記)。nil就是0。0也是基本資料型別,不能存放到NSArray中。

NSArray的常用方法

- (NSUInteger)count;

獲取集合元素個數

- (id)objectAtIndex:(NSUInteger)index;

獲得index位置的元素

- (BOOL)containsObject:(id)anObject;

是否包含某一個元素

- (id)lastObject;

返回最後一個元素

- (id)firstObject;

返回最後一個元素

- (NSUInteger)indexOfObject:(id)anObject;

查詢anObject元素在陣列中的位置(如果找不到,返回-1)

- (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;

在range範圍內查詢anObject元素在陣列中的位置

書寫NSArray簡寫形式

NSArray *arr = [NSArray arrayWithObjects:@"lnj", @"lmj", @"jjj", nil];
NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
// 獲取陣列元素的簡寫
NSLog(@"%@", [arr objectAtIndex:0]);
NSLog(@"%@", arr[0]);

NSArray遍歷

增強for 迴圈的使用

如何使用增強for迴圈,遍歷NSArray陣列

//逐個取出arr中的元素, 將取出的元素賦值給obj
// 注意: obj的型別可以根據陣列中元素的型別來寫, 不一定要寫NSObject
for (NSString *obj in arr) {
    NSLog(@"obj = %@", obj);                     
}

如何使用OC陣列的迭代器來遍歷陣列

// 每取出一個元素就會呼叫一次block
// 每次呼叫block都會將當前取出的元素和元素對應的索引傳遞給我們
// obj就是當前取出的元素, idx就是當前元素對應的索引
// stop用於控制什麼時候停止遍歷
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (idx == 1) {
        *stop = YES;
    }
    NSLog(@"obj = %@, idx = %lu", obj, idx);
}];

陣列排序

如何對資料進行排序

NSArray *arr = @[@10, @20, @5, @7, @15];
NSLog(@"排序前: %@", arr);

// 注意: 想使用compare方法對陣列中的元素進行排序, 那麼陣列中的元素必須是Foundation框架中的物件, 也就是說不能是自定義物件
elector:@selectoNSArray *newArr = [arr sortedArrayUsingSr(compare:)];
NSLog(@"排序後: %@", newArr);

如何對物件進行排序

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);

// 按照人的年齡進行排序

// 該方法預設會按照升序排序
NSArray *newArr = [arr sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(Person *obj1, Person *obj2) {
    // 每次呼叫該block都會取出陣列中的兩個元素給我們
    // 二分
    //        NSLog(@"obj1 = %@, obj2 = %@", obj1, obj2);
    return obj1.age > obj2.age; //降序
    //        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);

NSArray和NSString轉換

NSArray *arr = @[@"lnj", @"lmj", @"jjj"];

如何將陣列中每個元素拼接成字串

方法一:

// 1.定義一個可變字串儲存拼接之後的結果
NSMutableString *strM = [NSMutableString string];
// 2.遍歷陣列, 取出陣列中的每一個元素, 將元素新增到可變字串中
for (NSString *str in arr) {
    [strM appendString:str];
    // 3.每次新增完畢之後再新增一個-
    [strM appendString:@"-"];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = %@", strM);

方法二:

//把陣列元素連結成字串,用**作拼接符將陣列元素拼接成一個字串
NSString *str = [arr componentsJoinedByString:@"**"];
NSLog(@"str = %@", str);

如何通過一個字串生成一個數組

字串分割方法

NSString *str = @"lnj**lmj**jjj";
NSArray *arr = [str componentsSeparatedByString:@"**"];
NSLog(@"arr = %@", arr);

NSArray檔案讀寫

如何將陣列寫入檔案中

NSArray *arr = @[@"lnj", @"lmj", @"jjj"];
BOOL flag = [arr writeToFile:@"/Users/xiaomage/Desktop/abc.plist" atomically:YES];
NSLog(@"flag = %i", flag);

將陣列寫入檔案中,有什麼注意點

注意1:如果將一個數組寫入到檔案中之後, 本質是寫入了一個XML檔案 在iOS開發中一般情況下我們會將XML檔案的副檔名儲存為plist
注意2:writeToFile只能寫入陣列中儲存的元素都是Foundation框架中的類建立的物件, 如果儲存的是自定義物件那麼不能寫入
如何從檔案中讀取資料到NSArray中

從檔案中讀取一個數組,此方法在字典轉模型中,經常用到

NSArray *newArray = [NSArray arrayWithContentsOfFile:@"/Users/xiaomage/Desktop/abc.plist"];
NSLog(@"%@", newArray);

NSMutableArray

可變陣列 增刪改查

什麼是可變陣列?和NSArray有什麼區別

NSMutableArray是NSArray的子類
NSArray是不可變的,一旦初始化完畢後,它裡面的內容就永遠是固定的, 不能刪除裡面的元素, 也不能再往裡面新增元素
NSMutableArray是可變的,隨時可以往裡面新增\更改\刪除元素
如何建立一個空的陣列?建立可變陣列有什麼注意點?

1.建立空陣列

NSMutableArray *arrM = [NSMutableArray array];
NSMutableArray *arrM = [[NSMutableArray alloc] init];

2.注意點:

不能通過@[]來建立一個可變陣列, 因為@[]創建出來的是一個不可變的陣列
如果把一個不可變陣列當做一個可變陣列來使用, 會引發一個執行時的錯誤
例如:

NSMutableArray *arrM = @[@"lnj", @"lmj"];
[arrM addObject:@"JJJ"];

如何給可變陣列增加內容 方法一:

[arrM addObject:@"lnj"];

方法二:

// 將指定陣列中的元素都取出來, 放到arrM中 \
    並不是將整個陣列作為一個元素新增到arrM中
[arrM addObjectsFromArray:@[@"lmj", @"jjj"]];
// 注意: 以下是將整個陣列作為一個元素新增
//    [arrM addObject:@[@"lmj", @"jjj"]];
NSLog(@"%@", arrM);

如何給可變陣列插入內容

[arrM insertObject:@"xcq" atIndex:1];

NSRange range = NSMakeRange(2, 2);
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
// 插入一組資料, 指定陣列需要插入的位置, 和插入多少個
[arrM insertObjects:@[@"A", @"B"] atIndexes:set];

如何刪除可變陣列中的內容

刪除指定元素:

[arrM removeObjectAtIndex:0];

刪除陣列中最後一個元素

[arrM removeLastObject];

刪除index位置的元素

[arrM removeObject:@"A"];

如何替換可變陣列中的內容

[arrM replaceObjectAtIndex:1 withObject:@"M"];
//簡寫:
arrM[0] = @"ZS";
NSLog(@"%@", arrM);

如何獲取可變陣列中的內容

NSLog(@"%@", [arrM objectAtIndex:0]);