Objective-C之NSArray学习笔记(IOS 9.1)


NSArray类简介

  1. 有序且只可以存储Objective-C对象的数组
  1. 初始化后,内容不可变,长度也不可变,不能进行增、删、改操作
  1. 不能存放nil (nil是标志数组的结束)
  1. 在MRC模式下,会发送retain消息于每个加入数组中的元素都进行保持,数组被释放的时候会发送release消息

属性表(@property)

@property 描述
@property(readonly) NSUInteger count 数组元素的个数
@property(nonatomic, readonly) ObjectType firstObject 返回数组中的第一个元素
@property(nonatomic, readonly) ObjectType lastObject 返回数组中的最后一个元素
@property(readonly, copy) NSData *sortedArrayHint 用于排序
@property(readonly, copy) NSString *description 返回数组的内容“(内容在这)”

常用方法

常用类方法

数组对象的生成

+ (instancetype)array // 生成并返回一个空的数组对象
+ (instancetype)arrayWithObject:(ObjectType)anObject // 返回一个只有anObject的数组对象 

常用实例方法

数组对象的初始化

- (instancetype)initWithObjects:(ObjectType)firstObj, ... //返回以firstObj等元素生成的数组,以nil结束

便利构造器:arrayWithObjects:


- (instancetype)initWithObjects:(const ObjectType _Nonnull[])objects count:(NSUInteger)count    //返回包含前count个objects的数组

便利构造器:arrayWithObjects:count:


- (instancetype)initWithArray:(NSArray<ObjectType> *)anArray //使用anArray来生成一个新的数组

便利构造器:arrayWithArray:


- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag //falg为YES的时候,底层会使用copyWithZone:方法为每个array元素生成一个副本,并把新生成的副本数组返回

数组元素的访问

- (NSUInteger) count //返回元素数量
- (NSUInteger)indexOfObject:(ObjectType)anObject //返回数组中元素为anObject的最小的下标(利用isEqual:方法进行比较)
- (BOOL)containsObject:(ObjectType)anObject //判断数组中是否有anObject元素,如果没有就返回NSNotFound(宏定义,就是没有找到的意思)
- (ObjectType)objectAtIndex:(NSUInteger)index //返回下标对应的元素(index大于数组的count时就发生NSRangeException异常)
@property(nonatomic, readonly) ObjectType lastObject //返回数组中的最后一个元素,如果没有接收者(就是没有取值操作)就返回nil
- (void)getObjects:(ObjectType _Nonnull [])aBuffer range:(NSRange)aRange //根据aRange指定的范围复制数组元素到C语言的aBuffer缓冲区中(aBuffer可以通过malloc进行创建)
- (NSArray<ObjectType> *)subarrayWithRange:(NSRange)range //返回根据aRange指定的范围从原数组中生成一个新的数组

数组元素的比较

- (BOOL)isEqualToArray:(NSArray<ObjectType> *)otherArray //判断两个数组的元素是否一致(相同下标所对应的元素要相等)
- (ObjectType)firstObjectCommonWithArray:(NSArray<ObjectType> *)otherArray //返回消息接收者与otherArray第一个相同的元素

添加新元素到数组(间接添加,返回一个新数组)

- (NSArray<ObjectType> *)arrayByAddingObject(ObjectType)anObject //返回一个由消息接收者和anObject共同组成的新数组(anObject加到新数组的末尾)
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray //返回一个由消息接收者和otherArray共同组成的新数组(otherArray加到新数组的末尾)

数组元素的排序

- (NSArray<ObjectType> *)sortedArrayUsingSelector:
(SEL)comparator //使用指定方法comparator(可以自定义,也可以使用对象本身拥有的方法;要求必须要有一个参数,且其返回值必须为以下三种情况中的一种:
 1. NSOrderedAscending  消息接收者元素 < 形参元素
 2. NSOrderedSame       消息接收者元素 == 形参元素
 3. NSOrderedDescending 消息接收者元素 > 形参元素
),返回排好序的新数组
- (NSArray<ObjectType> *)sortedArrayUsingFunction:
(NSInteger (*)(ObjectType, ObjectType, void *))comparator
context:(void *)context //使用指定的comparator方法(要求必须要有三个形式参数,前两个是数组中的元素,第三个元素是自定义形参;返回值是NSComparisonResult类型(NSInteger也行),该类型的值就是前面方法中的NSOrderedSame等三者),返回一个排好序的新数组

向数组中的元素发送消息

- (void)makeObjectsPerformSelector:(SEL)aSelector //为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止
//注意:
//  i: aSelector指定的方法不能有参数
// ii: 指定的方法发生波及作用(就是改变数组之类的操作)
//iii: 如果没有指定的方法会抛出NSInvalidArgumentException异常
- (void)makeObjectsPerformSelector:(SEL)aSelector
withObject:(id)anObject //为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止
//注意:
//  i: aSelector指定的方法只能有一个参数anObject
// ii: 指定的方法发生波及作用(就是改变数组之类的操作)
//iii: 如果没有指定的方法会抛出NSInvalidArgumentException异常

数组的文件输入与输出操作

- (NSString *)description //以ASCII编码的属性列表格式输出数组的元素

- (NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)aPath //根据属性列表格式保存的文件来初始化数组,aPath指文件路径

便利构造器:arrayWithContentsOfFile:


- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag //把代表这个数组内容的属性列表输出到指定的文件中,path指点生成的文件的路径(flag是控制写入的,如果为YES则表示完全写入)

参考方法(NSString):writeToFile: atomically: encoding: error:


- (NSString *)componentsJoinedByString:(NSString *)separator //把数组元素(以“,”分隔的元素)自第一个元素至最后一个元素用separator连接起来形成字符串(假设separatoro "-"即:firstObject-SecondObject...-LastObject)
- (NSArray<NSString *> *)pathsMatchingExtensions:(NSArray<NSString *> *)filterTypes //筛选具有特定扩展名的字符串,如:“.jpg”

数组的遍历

- (NSEnumerator<ObjectType> *)objectEnumerator //返回一个枚举器,用于遍历数组

数组,小试牛刀

//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.数组对象的生成
        //1.1 //返回空的数组对象
        NSArray *arry1_1 = [NSArray array];
        NSLog(@"arry1_1 --> %@",arry1_1);    //打印对象的内容,返回一个字符串“( 内容在这 )”
        //1.2 返回一个只有 @"你好!数组!" 元素的数组
        NSArray *arry1_2 = [NSArray arrayWithObject:@"你好!数组!"];
        NSLog(@"arry1_2 --> %@",[arry1_2 description]);
        
        //2.数组对象的初始化
        //2.1 返回一个以@[@"-1-",@"-2-",@"-3-"] - @[@1,@2,@3]为基础逐一创建的,“-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可以用,但IOS 9.2 不可以了
//        NSArray *arry2_2 = [[NSArray alloc] initWithObjects:(const id  _Nonnull __unsafe_unretained *) count:(NSUInteger)]
        
        //2.3 根据arry2_1数组生成arry2_3
        NSArray *arry2_3 = [[NSArray alloc] initWithArray:arry2_1];
        NSLog(@"arry2_3 --> %@",arry2_3);
        //2.4 copeItem值为YES的时候会以arry为蓝本生成一个副本返回组arry2_4
        NSArray *arry = @[@"1", @"2", @"3", @"4"];
        NSArray *arry2_4 = [[NSArray alloc] initWithArray:arry copyItems:YES];
        NSLog(@"arry2_4 --> %@",arry2_4);
        
        //3.数组对象的访问--------------=====
        NSArray *arry3 = @[@1,@2,@3,@"4",@[@"1",@"2",@YES],@2.0f];//快速生成数组,只能用在NSArray处,因为生成的数组是不可变的
        //3.1 元素的数量
        NSLog(@"arry3 --> %@,词条数:%lu",arry3, [arry3 count]);
        //3.2 通过 object 获取相应的 index
        NSLog(@"arry3 --> %lu", [arry3 indexOfObject:@2]);
        NSLog(@"arry3 --> %lu", [arry3 indexOfObject:@YES]);
        //3.3 根据 index 获取相应的 object
        NSString *str = [arry3 objectAtIndex:3];
        NSArray *arryTemp = [arry3 objectAtIndex:4];
        NSLog(@"str = %@, arryTemp = %@", str, arryTemp);

        //3.4 获取数组中的第一个元素和最后一个元素                [NSNumber intValue] @property属性
        NSLog(@"firstObject = %d, lastObject = %@", [[arry3 firstObject] intValue], [arry3 lastObject]);
        
        //3.5 复制在原数组一个 aRange 范围的元素到一个C语言缓冲区,并返回由这些元素组成的一个新的数组
        //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 抽取原数组中 range 范围的元素并以此生成一个新的数组并返回
        NSRange range;      //创建一个 range 结构体
        range.location = 2;
        range.length   = 2;
        NSArray *arryOfArange = [arry3 subarrayWithRange:range];
        NSLog(@"arryOfArange = %@", arryOfArange);
        
        //4.数组元素的比较
        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 两个数组元素完全一样才会返回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 返回两个数组中第一个相同的元素
        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.向数组中增加元素
        NSArray *arry5 = [NSArray arrayWithObjects:@1,@2,@3,@4,nil];
        //5.1 返回一个由消息接收者和anObject共同组成的新数组(anObject加到新数组的末尾)
        NSLog(@"arry5 & object = %@", [arry5 arrayByAddingObject:@5]);
        
        //5.2 返回一个由消息接收者和otherArray共同组成的新数组(otherArray加到新数组的末尾)
        NSLog(@"arry5 & arry %@", [arry5 arrayByAddingObjectsFromArray:@[@"one",@"two"]]);
        
        //6.数组的排序
        NSArray *arryString = @[@"man",@"woman",@"cat",@"dog",@"fish"];
        NSArray *arryNumber = @[@5,@2,@8,@61,@1,@13];
//        6.1 使用指定方法comparator(可以自定义,也可以使用对象本身拥有的方法),返回排好序的新数组,要求:
//        (1).必须要有一个参数
//        (2).返回值必须为以下三种情况中的一种:
//            1). NSOrderedAscending  消息接收者元素 < 形参元素
//            2). NSOrderedSame       消息接收者元素 == 形参元素
//            3). NSOrderedDescending 消息接收者元素 > 形参元素
        //使用 NSString 自带的 compare: 方法
        NSArray *sortedStringArray = [arryString sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"sortedStringArray : %@", sortedStringArray);
        
        //6.2 使用指定的comparator方法,返回一个排好序的新数组,要求:
//        1).必须要有三个形式参数,前两个是数组中的元素,第三个元素是自定义形参;
//        2).返回值是NSComparisonResult类型(NSInteger也行),该类型的值就是前面方法中的NSOrderedSame等三者)
        //应用于基本数据类型
        NSArray *sortedNumberArray = [arryNumber sortedArrayUsingFunction:intSort context:nil];
        NSLog(@"sortedNumberArray : %@", sortedNumberArray);
        
        //7.给数组中的元素发送消息
        msgTest *test1 = [[msgTest alloc] init];
        msgTest *test2 = [[msgTest alloc] init];
        msgTest *test3 = [[msgTest alloc] init];
        NSArray *arryPerforms = @[test1, test2, test3];
        //7.1 为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止
        //注意:
        //  i: aSelector指定的方法不能有参数
        // ii: 指定的方法发生波及作用(就是改变数组之类的操作)
        //iii: 如果没有指定的方法会抛出NSInvalidArgumentException异常
        [arryPerforms makeObjectsPerformSelector:@selector(test)];
        
        //7.2 为数组中的每一个元素发送一条消息(aSelector指定的方法),从数组的第一个元素依次发送到最后一个元素为止
        //注意:
        //  i: aSelector指定的方法只能有一个参数anObject
        // ii: 指定的方法发生波及作用(就是改变数组之类的操作)
        //iii: 如果没有指定的方法会抛出NSInvalidArgumentException异常
        [arryPerforms makeObjectsPerformSelector:@selector(oneTest:) withObject:@7];
        
        //8.数组对象与文件操作
        //8.1 根据plist文件来创建数组
        NSArray *arry8_1 = [NSArray arrayWithContentsOfFile:@"/Users/windy/Desktop/OC pros/NSArrayTest/NSArrayTest/arry8.plist"];
        NSLog(@"arry8_1 --> %@", [arry8_1 description]);
        //8.2 把数组元素写进文件
        NSArray *arry8_2 = @[@"你", @[@"love",@"someone"], @"好"];
        [arry8_2 writeToFile:@"/Users/windy/Desktop/OC pros/NSArrayTest/NSArrayTest/arry8_2.plist" atomically:YES];
        //8.3 把数组元素(以“,”分隔的元素)自第一个元素至最后一个元素用separator连接起来形成字符串
        //假设separatoro "-"即:firstObject-SecondObject...-LastObject
        NSString *strTemp = [arry8_2 componentsJoinedByString:@"?"];
        NSLog(@"strTemp --> %@", strTemp);
        
        //8.4 筛选具有特定扩展名的字符串,如:“jpg”等它会自动根据扩展名进行查找不能用“.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.数组元素的遍历(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指代数组中的元素,如:@1
            NSLog(@"%d", [obj intValue]);
        }];
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272

推荐阅读更多精彩内容