OC之NSArray/NSMutableArrray

简介:

Objective-C中除了可以使用C中的基本数组外,int[5],char word[] ={a,b,c};Foundation还提供了NSArray类,其有如下特点:。

(1)NSArray是有序的对象集合。

(2)NSArray保存的对象可以是不同的对象

(3)int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

例如下面的代码在运行时会报错:

NSArray *arrs = [[NSArray alloc]initWithObjects:@”abc”,@”123”,456,nil];

就像NSStringNSMutableString一样,同样也存在可变数组和不可变数组.不可变数组是由NSArray类处理的,而可变数组则是由NSMutableArrray处理的.后者是前者的子类,也就是说NSMutableArrray继承了NSArray的方法.

NSArray 不可变数组

使用NSArray关键字创建一个不可变的数组,一旦初始化完毕后这个数组的元素是不可以在动态的添加与删除。例如:

int main(int argc, const char * argv[])

{

    @autoreleasepool {

 

        //创建一个包含星期的数组

        NSArray *days = [NSArray arrayWithObjects:@"SUN",

@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];

 

        //获取数组所包含对象个数

        NSLog(@"size of days:%ld",(unsigned long)[days count]);  //size of days:7

 

        //循环打印数组中的元素,比较普遍,但效率不高

        for (int i=0; i<[days count]; i++) {

            NSLog(@"%@",[days objectAtIndex:i]);

        }

 

        //另一种方法打印数组中的元素,效率高,推荐使用

        for(id day in days){

            NSLog(@"%@",day);

        }

    }

    return 0;

}

对于数组创建,编译器为了减少代码量,提供了更简便方法,比如:

NSArray *days = [NSArray arrayWithObjects:@"SUN",

@"MON",@"TUE",@"WED",@"THU",@"FRI",@"SAT", nil];

等价于:

NSArray *days =

@[@"SUN","MON","TUE","WED","THU","FRI","SAT"];

创建多维NSArray:

NSArray *days = @{

@{@”sum,@”mon”,@”tue”,@”wed”},

@{@”sum,@”mon”,@”tue”,@”fri”}

@{@”fri,@”mon”,@”tue”,@”sat”}

@{@”sat,@”mon”,@”tue”,@”wed”}

}

NSArray的类方法arrayWithObjects:使用一列对象作为元素创建数组,这种情况下需要按顺序列出对象并使用逗号隔开。将这个数组的最后一个值指定为nil,标记参数数组的结束.它实际上并不会存储在数组中.

[array count] 得到这个数组对象的长度。

[array objectAtIndex index]传入数组的索引(index) 得到数据对象。

[arrayWithObjects: :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil,以标志结束.

+(id)arrayWithObjects:obj1,obj2,nil 创建一个新的数组,obj1,obj2……是他的元素对象,以nil对象结尾

-(BOOL)containsObject:obj 确定数组中是否包含对象obj

-(NSUInteger)count 返回数组元素个数

-(NSUInteger)indexOfObject:obj 第一个包含obj元素的索引号

-(id)objectAtIndex;i 返回存储在位置 i 的对象

-(void)makeObjectsPerformSelector:(SEL)selector  selector 只是的消息发送给数组中的每个元素

-(NSArray*)sortedArrayUsingSelector:(SEL)selector 根据selector 指示的比较方法对数组进行排序,比如:

NSArray * array = @[@"b",@"d",@"a",@"z"];

array = [array sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"排序后 array %@",array);

 

-(BOOL)writeToFile:path atomically:(BOOL)flag 将数组写入指定的文件中,如果flag  YES,则需要先创建一个临时文件

MSMutableArray可变数组

大多时候我们需要动态的增加和删除数组中的元素,这就需要使用MSMutableArray。例如:

int main(int argc, const char * argv[])

{

 

    @autoreleasepool {

       //创建一个空数组

       NSMutableArray *arrs = [NSMutableArray array];

 

        //C中的一些基本元素我们可以用NSNumber类来包装,类似java中的装箱,另外还有一些struct类型的数据我们也可以用NSNumber类的父类NSValue来进行包装,包装成NSValue的对象再将其放入数组中。

        int age=23;

        char c='a';

        float f=3.1415926;

        NSRect rect =NSMakeRect(1, 2, 3, 4);

 

        NSNumber *objAge = [NSNumber numberWithInt:age];

        NSNumber *objC =[NSNumber numberWithChar:c];

        NSNumber *objF =[NSNumber numberWithFloat:f];

        NSValue *objRect = [NSValue valueWithRect:rect];

 

        [arrs addObject:objAge];

        [arrs addObject:objC];

        [arrs addObject:objF];

        [arrs addObject:objRect];

 

        //如果要添加空的话可以用以下方法

        [arrs addObject:[NSNull null]];

 

        NSLog(@"Size of arrs: %li",(unsigned long)[arrs count]); //Size of arrs: 5

        NSLog(@"%@",arrs);

 

        //创建一个指定初始容量的数组

        NSMutableArray *arrs2 =

[NSMutableArray arrayWithCapacity:3];

 

        //指定初始容量为3,但我们添加了5个对象

        [arrs2 addObject:@"obj1"];

        [arrs2 addObject:@"obj2"];

        [arrs2 addObject:@"obj3"];

        [arrs2 addObject:@"obj4"];

        [arrs2 addObject:@"obj5"];

 

        //将对象 obj 插入到索引为 i 的位置

        [arrs2 insertObject:@"obj" atIndex:0];

 

        //删除指定索引处的对象

        [arrs2 removeObjectAtIndex:3];

 

        //遍历数组

        for(id obj in arrs2){

            NSLog(@"%@",obj);    //obj,obj1,obj2,obj4,obj5

        }

 

        //合并字符串数组

        NSString *str = [arrs2 componentsJoinedByString:@"|"];

        NSLog(@"%@",str);  //obj|obj1|obj2|obj4|obj5

 

        //字符串切割成数组

        NSArray *arr3=[str componentsSeparatedByString:@"|"];

        NSLog(@"%@",arr3);

 

    }

    return 0;

}

 

NSMutableArray类常用方法

array 创建一个空数组

+(id)arrayWithCapacity:size 创建一个数组,指定容量为size

-(id)initWithCapacity:size 初始化一个新分配的数组,指定容量为size

-(void)addObject:obj 将对象obj添加到数组末尾

-(void)insertObject:obj atIndex:i 将对象 obj 插入到索引为 i 的位置

-(void)replaceObject:obj atIndex:i 将数组中索引为 i 处的元素用obj 置换

-(void)removeObject:obj 从数组中删除所有是 obj 的对象

-(void)removeObjectAtIndex:i 从数组中删除索引为 i 的对像

-(void)sortUsingSelector:(SEL)selector  selector 只是的比较方法将数组排序


目录
相关文章
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
329 0
|
Ubuntu 网络安全 Docker
Ubuntu 安装与配置ssh (docker)
Ubuntu 安装与配置ssh (docker)
318 0
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
2979 1
|
9月前
|
机器学习/深度学习 人工智能 弹性计算
AI剧本生成与动画创作解决方案评测:这项技术能为短视频创作带来哪些改变?
随着短视频行业的竞争加剧,创作速度和质量成为关键。阿里云的《AI剧本生成与动画创作》解决方案利用NLP和计算机视觉技术,通过简单的关键词或主题自动生成剧本和动画,显著提高创作效率并降低技术门槛。评测显示,该方案能在几小时内完成从剧本到动画的创作,适应市场热点需求。然而,AI在创意表达和细节处理上仍有一定局限性,尤其在高要求创作中表现不如手工精细。尽管如此,对于需要快速响应市场的创作者来说,这一工具无疑是一个巨大的助力,未来有望进一步提升创作灵活性和效率。
383 3
|
12月前
|
安全 jenkins 持续交付
如何在 Jenkins 中配置邮件通知?
如何在 Jenkins 中配置邮件通知?
649 11
|
10月前
|
存储 监控 算法
内网监控系统之 Go 语言布隆过滤器算法深度剖析
在数字化时代,内网监控系统对企业和组织的信息安全至关重要。布隆过滤器(Bloom Filter)作为一种高效的数据结构,能够快速判断元素是否存在于集合中,适用于内网监控中的恶意IP和违规域名筛选。本文介绍其原理、优势及Go语言实现,提升系统性能与响应速度,保障信息安全。
150 5
|
10月前
|
JSON 缓存 API
深度探索淘宝详情API接口:高效获取商品信息的实践指南
淘宝详情API接口是阿里巴巴开放平台的重要组成部分,帮助开发者通过程序化方式获取淘宝商品的详细信息,如标题、价格、销量等。本文介绍其使用方法,涵盖权限申请、请求构造、异常处理及高级应用,助力开发者优化电商体验和业务决策。
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
685 9
|
算法 程序员
【算法训练-链表 一】【反转链表】反转链表、区间反转链表、K个一组反转链表
【算法训练-链表 一】【反转链表】反转链表、区间反转链表、K个一组反转链表
265 0