系列:iOS开发-NSArray

系列:iOS开发-NSArray

忙了一上午,解决了几个bug,现在终于抽出来一点时间喝点水休息下,
想着系列这么浩大的一个工程,才刚刚开始写,不能断了,就跟写小说一样,既然是系列,那么就需要不停更...
好吧.
简单的说说iOS开发中的数组-NSArray

首先
OC的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
类似于之前说的字符串一样,OC的数组也有两种,可变数组和不可变数组
一步一步来,
首先是NSArray的创建
我们可以从NSArray的类里面看到很多类方法的创建和实例方法的创建

@interface NSArray<ObjectType> (NSArrayCreation)

+ (instancetype)array;
+ (instancetype)arrayWithObject:(ObjectType)anObject;
+ (instancetype)arrayWithObjects:(const ObjectType [])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray<ObjectType> *)array;

- (instancetype)initWithObjects:(ObjectType)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array;
- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;

+ (nullable NSArray<ObjectType> *)arrayWithContentsOfFile:(NSString *)path;
+ (nullable NSArray<ObjectType> *)arrayWithContentsOfURL:(NSURL *)url;
- (nullable NSArray<ObjectType> *)initWithContentsOfFile:(NSString *)path;
- (nullable NSArray<ObjectType> *)initWithContentsOfURL:(NSURL *)url;

@end

我们仿照着之前NSString的方式,随便列举一些例子看看,

        //init
        NSArray *arr1 = [[NSArray alloc]init];
        NSLog(@"%@",arr1);
        
        //array
        NSArray *arr2 = [NSArray array];
        NSLog(@"%@",arr2);
        
        //arrayWithObject
        NSArray *arr3 = [NSArray arrayWithObject:@"arr3"];
        NSLog(@"%@",arr3);
        
        //arrayWithObjects:
        NSArray *arr4 = [NSArray arrayWithObjects:@"arr4",@"arr4", nil];
        NSLog(@"%@",arr4);
        
        NSArray *arr5 = @[@"arr5",@"arr5",@"arr5",@"arr5",@"arr5"];
        NSLog(@"%@",arr5);
        
        //initWithObjects:
        NSArray *arr6 = [[NSArray alloc]initWithObjects:@"arr6",@"arr6", nil];
        NSLog(@"%@",arr6);
        
        //arrayWithArray:
        NSArray *arr7 = [NSArray arrayWithArray:arr6];
        NSLog(@"%@",arr7);

当然创建的方式不单单这些,比如从文件里面读取数组,网络访问返回的数组...
这些都在具体的例子中再对应创建...

接下来再说说NSArray的一些常用方法.

        //常用方法
        //count  (读取数组元素个数)
        NSLog(@"%ld",[arr7 count]);
        
        //objectAtIndex:  (读取下标对应的元素,,,也可以用[]  C的方式直接读取)
        NSLog(@"%@,%@",[arr7 objectAtIndex:0],arr7[0]);
        
        //arrayByAddingObject:  (追加一个元素,返回新的数组)
        NSArray *arr8 = [arr7 arrayByAddingObject:@"arr8"];
        NSLog(@"%@",arr8);
        
        //arrayByAddingObjectsFromArray:   (追加多个元素,返回新的数组)
        NSArray *arr9 = [arr8 arrayByAddingObjectsFromArray:arr7];
        NSLog(@"%@",arr9);
        
        //componentsJoinedByString:   (使用某字符串合并数组元素成一个新的字符串)
        NSLog(@"%@",[arr9 componentsJoinedByString:@"-"]);
        
        //containsObject:  (数组中是否有某元素)
        NSLog(@"%d",[arr9 containsObject:@"arr9"]);
        
        //indexOfObject   (某元素对应的下标)
        NSLog(@"%ld",[arr9 indexOfObject:@"arr8"]);
        
        //indexOfObject:inRange:  (对应范围内的某元素的下标)
        NSLog(@"%ld",[arr9 indexOfObject:@"arr8" inRange:NSMakeRange(0, arr9.count)]);
        
        //isEqualToArray:    (两个数组是否相等)
        NSLog(@"%d",[arr9 isEqualToArray:arr8]);
        
        //firstObject  (第一个元素)
        NSLog(@"%@",[arr9 firstObject]);
        
        //lastObject  (最后一个元素)
        NSLog(@"%@",[arr9 lastObject]);
        
        //objectsAtIndexes  (对应的多个下标的多个元素)
        NSLog(@"%@",[arr9 objectsAtIndexes:[NSIndexSet indexSetWithIndex:1]]);
        
        //数组遍历
        //for循环
        for (int i = 0; i<arr9.count; i++) {
            NSLog(@"%@",arr9[i]);
        }
        
        //for in
        for (id obj in arr9) {
            NSLog(@"%@",obj);
        }
        
        //迭代器
        NSEnumerator *enumerator = [arr9 objectEnumerator];
        id obj = nil;
        while(obj = [enumerator nextObject]){
            NSLog(@"%@",obj);
        }
        
        //block
        [arr9 enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSLog(@"%ld-%@",idx,obj);
            //若终断循环
            //*stop = YES;
        }];

当然以上的方法都是一些基础的方法,经常会在项目中使用的方法..还有些不常用的和系统没有提供的需要在平时开发中再做积累,
当然我刚刚也说了数组的遍历,上面也举例了几个,后期我会单独对其进行分析,比较各自的优缺点和性能.这里暂不描述

接下来学习的是NSArray的子类 可变数组NSMutableArray
还是类似的学习方式,创建+常用方法
首先是创建

        //init
        NSMutableArray *arr10 = [[NSMutableArray alloc]init];
        NSLog(@"%@",arr10);
        
        //array
        NSMutableArray *arr11 = [NSMutableArray array];
        NSLog(@"%@",arr11);
        
        //arrayWithCapacity:  (创建初始长度为多少的数组,但因为其实可变数组,所以即使长度不够什么的,也没有关系,比如可以设0)
        NSMutableArray *arr12 = [NSMutableArray arrayWithCapacity:0];
        NSLog(@"%@",arr12);
        
        //initWithCapacity:
        NSMutableArray *arr13 = [[NSMutableArray alloc]initWithCapacity:0];
        NSLog(@"%@",arr13);

当然因为其作为NSArray的子类,所以NSArray创建的方式,它也都有
这里就不一一举例了

常用方法:

        //addObject:  (添加一个元素)
        [arr13 addObject:@"arr13"];
        NSLog(@"%@",arr13);
        
        //addObjectsFromArray:   (添加一组元素)
        [arr13 addObjectsFromArray:arr9];
        NSLog(@"%@",arr13);
        
        //insertObject:atIndex  (在某下标插入某一个元素)
        [arr13 insertObject:@"arr" atIndex:0];
        NSLog(@"%@",arr13);
        
        //removeLastObject   (删除最后一个元素)
        [arr13 removeLastObject];
        NSLog(@"%@",arr13);
        
        //removeObjectAtIndex:  (删除某下标对应的元素)
        [arr13 removeObjectAtIndex:0];
        NSLog(@"%@",arr13);
        
        //replaceObjectAtIndex:withObject   (替换某下标的元素)
        [arr13 replaceObjectAtIndex:0 withObject:@"index"];
        NSLog(@"%@",arr13);
        
        //exchangeObjectAtIndex:withObjectAtIndex:   (替换两个下标对应元素)
        [arr13 exchangeObjectAtIndex:0 withObjectAtIndex:1];
        NSLog(@"%@",arr13);
        
        //removeAllObjects    (移除所有元素)
        [arr13 removeAllObjects];
        NSLog(@"%@",arr13);
        
        [arr13 addObjectsFromArray:arr9];
        
        //removeObject:inRange:  (移除某范围内指定元素)
        [arr13 removeObject:@"arr" inRange:NSMakeRange(0, 1)];
        NSLog(@"%@",arr13);
        
        //removeObject:   (移除指定元素)
        [arr13 removeObject:@"arr8"];
        NSLog(@"%@",arr13);
        
        //removeObjectsInArray:   (删除某数组内存在的元素)
        [arr13 removeObjectsInArray:arr7];
        NSLog(@"%@",arr13);
        
        //removeObjectsInRange:  (删除指定范围内的元素)
        [arr13 removeObjectsInRange:NSMakeRange(0, 1)];
        NSLog(@"%@",arr13);
        
        //setArray:   (设置数组元素)
        [arr13 setArray:arr9];
        
        //sortUsingSelector:  (排序)
        [arr13 sortUsingSelector:@selector(compare:)];

当然还是一样的,凡是NSAarray的方法,NSMutableArray也都是支持的,方法很多有很多没有,需要在开发中自己积累,当然百度,谷歌...也都是方法的来源....
常用方法基本就是这些,其实复杂的,特殊需求的方法绝大多数也是基于这些演变而来...

至于上面也有说道排序,
大家都学过C语言,肯定都能脱口而出冒泡\选择\插入...
当然OC中也是有排序的方法的,sortUsingSelector: sortUsingComparator:等等,后续也会单独举例...

今天就到这里..
接下来讲的是key-value 也就是OC中的NSDictionary...
我想大家也都知道了 可变,不可变.....

Demo地址:https://github.com/spicyShrimp/DEMO_OC

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,036评论 29 470
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事...
    irenb阅读 5,122评论 1 20
  • 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
    Jt_Self阅读 708评论 0 4
  • 前言 上一篇简单介绍了一下通过运行时添加方法。这篇文章呢,侧重于方法的hook。 Method Swizzling...
    SHUTUP阅读 367评论 0 1
  • 说起外公,我放暑假的时候,总是会遇到外婆和外公两人找一个蒲团,一起面对面下跳棋,我在旁边看,两人的水平简直不分上下...
    玫瑰西海岸阅读 177评论 0 1