Objective-C之NSArray學(xué)習(xí)筆記(IOS 9.1)


NSArray類簡介

  1. 有序且只可以存儲Objective-C對象的數(shù)組
  1. 初始化后,內(nèi)容不可變,長度也不可變,不能進(jìn)行增、刪、改操作
  1. 不能存放nil (nil是標(biāo)志數(shù)組的結(jié)束)
  1. 在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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 3,125評論 2 9
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,217評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,632評論 1 32
  • “她一米七八 一頭長發(fā)?!?▼▼▼ 愛是一種相遇,卻無法預(yù)見。 火火說:我一生中最奢侈的事,是在大學(xué)...
    徐涂閱讀 737評論 0 1
  • 休假。 晚起,打車,去電影院。手里捧著一瓶可樂,進(jìn)去看了《三塊廣告牌》。出來的時候,去茶顏悅色買了杯冰的幽蘭拿鐵,...
    莫逆莫逆閱讀 240評論 1 3

友情鏈接更多精彩內(nèi)容