Objective-C NSArray和NSMutableArray的详解 使用_{丸の子}的博客-程序员秘密

技术标签: java  mac/IOS  移动开发  

Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

1、NSArray 不可变数组

[array count] : 数组的长度。
[array objectAtIndex 0]: 传入数组脚标的id 得到数据对象。
[arrayWithObjects; ...] :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil。

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject *obj = [[NSObject alloc]init];
NSArray *array = [NSArray arrayWithObjects:
@"a",
obj,
@"c",nil];
NSLog(@"array Count:%lu",[array count]);
//遍历数组
for (NSObject *object in array) {
NSLog(@"数组对象:%@", object);
}
[obj release];
}
return 0;
}

打印结果:
[quote]
2012-07-09 10:52:17.050 objectiveC[944:403] array Count:3
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:a
2012-07-09 10:52:17.052 objectiveC[944:403] 数组对象:<NSObject: 0x7fe479c14110>
2012-07-09 10:52:17.053 objectiveC[944:403] 数组对象:c
[/quote]
查找数组索引对应的对象
NSLog(@"Index 2:%@", [array objectAtIndex:2]);

打印结果:2012-07-09 10:55:16.382 objectiveC[993:403] Index 2:c

2、NSMutableArray可变对象数组

[NSMutableArray arrayWithCapacity:6] :初始化可变数组对象的长度,如果后面代码继续添加数组超过长度6以后NSMutableArray的长度会自动扩充,6是自己可以设置的颗粒度。
[array addObject:...] : 向可变数组尾部添加数据对象。
[array addObjectsFromArray:..] :向可变数组尾部添加一个数组对象。

2.1普通使用:

#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject *obj = [[NSObject alloc]init];
NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
[muArray addObject:@"对象1"];
[muArray addObject:@"对象2"];
[muArray addObject:@"对象3"];
[muArray addObject:@"对象4"];
[muArray insertObject:@"搅局的" atIndex:2];
[muArray addObject:obj];
for (NSObject * object in muArray) {
NSLog(@"数组对象:%@", object);
}
[obj release];
}
return 0;
}

打印:
[quote]2012-07-09 14:01:08.994 objectiveC[2090:403] 数组对象:对象1
2012-07-09 14:01:08.996 objectiveC[2090:403] 数组对象:对象2
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:搅局的
2012-07-09 14:01:08.997 objectiveC[2090:403] 数组对象:对象3
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:对象4
2012-07-09 14:01:08.998 objectiveC[2090:403] 数组对象:<NSObject: 0x109714110> [/quote]
NSRange range = NSMakeRange(0,3); 设置一个范围为 0 到 3 之间。
[array removeObject:obj inRange:range] : 设置在一个范围内删除数据,如果这个范围内没有删除的这个对象则不会删除任何东西。例子中因为obj对象在 数组 0 到 3的范围内,所以obj就被删除掉了。

2.2 removeObject和removeObjectIdenticalTo

[array removeObject:(id)] :删除数组中指定元素,根据对象isEqual消息判断。
[array removeObjectIdenticalTo:(id)] : 删除数组中指定元素,根据对象的地址判断
[array removeObjectIdenticalTo:(id) inRange:(NSRange)] : 在指定范围内删除指定的元素。
[array removeObjectAtIndex:(NSUInteger)]:删除数组中指定脚标索引的数据。
[array removeObjectsInArray:(NSArray *)] :删除一个数组的元素。
下面我们主要验证下removeObject removeObjectIdenticalTo这两个方法的区别,
先实验removeObject的使用

int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *str1 = [[NSString alloc] init];
NSString *str2 = [[NSString alloc] init];
NSString *str3 = [str1 stringByAppendingFormat:@"字符串"];
NSString *str4 = [str2 stringByAppendingFormat:@"字符串"];

NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
[muArray addObject:@"对象"];
[muArray addObject:str3];
[muArray addObject:str4];
for (NSObject * object in muArray) {
NSLog(@"数组对象:%@", object);
}

if ([str3 isEqual:str4]) {
NSLog(@"str1 isEqual str2");
}
if (str3 == str4) {
NSLog(@"str1 == str2");
}
[muArray removeObject:str3];
for (NSObject * object in muArray) {
NSLog(@"数组对象:%@", object);
}
[str1 release];
[str2 release];
}
return 0;
}

运行打印:
[quote]2012-07-09 14:57:52.059 objectiveC[2399:403] 数组对象:对象
2012-07-09 14:57:52.061 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] 数组对象:字符串
2012-07-09 14:57:52.062 objectiveC[2399:403] str1 isEqual str2
2012-07-09 14:57:52.063 objectiveC[2399:403] 数组对象:对象[/quote]
这时,数组里的两个“字符串”对象都被去除了。
现在试试 removeObjectIdenticalTo
代码改成:
[muArray removeObjectIdenticalTo:str3];

打印:
[quote]2012-07-09 14:59:53.520 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.521 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.522 objectiveC[2432:403] 数组对象:字符串
2012-07-09 14:59:53.523 objectiveC[2432:403] str1 isEqual str2
2012-07-09 14:59:53.523 objectiveC[2432:403] 数组对象:对象
2012-07-09 14:59:53.524 objectiveC[2432:403] 数组对象:字符串[/quote]
数组中有个还有一个“字符串”留下来了。证明removeObjectIdenticalTo是通过对象的地址做判断的,
我们用对比两个对象isEqual,用==对比对象的地址,打印出来了str1 isEqual str2

inRange的使用

NSRange rang = NSMakeRange(0, 3);
[muArray removeObject:obj inRange:rang];

指定范围删除对象,其他方法也可以指定范围删除,如果对象不在这个范围内,则不会被删除。
2.3替换某索引值对应的对象

int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject *obj = [[NSObject alloc]init];

NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
[muArray addObject:@"对象1"];
[muArray addObject:@"对象2"];
[muArray addObject:@"对象3"];
[muArray addObject:@"对象4"];
[muArray addObject:obj];

for (NSObject * object in muArray) {
NSLog(@"数组对象:%@", object);
}
[muArray replaceObjectAtIndex:4 withObject:@"字符串替换回来"];
for (NSObject * object in muArray) {
NSLog(@"数组对象:%@", object);
}
[obj release];
}
return 0;
}

替换后的打印结果:
[quote]2012-07-09 15:06:01.919 objectiveC[2497:403] 数组对象:对象1
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象2
2012-07-09 15:06:01.920 objectiveC[2497:403] 数组对象:对象3
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:对象4
2012-07-09 15:06:01.921 objectiveC[2497:403] 数组对象:字符串替换回来[/quote]
3、数组迭代的遍历方法

int main(int argc, const char * argv[])
{
@autoreleasepool {
NSObject *obj = [[NSObject alloc]init];

NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
[muArray addObject:@"对象1"];
[muArray addObject:@"对象2"];
[muArray addObject:@"对象3"];
[muArray addObject:@"对象4"];
[muArray addObject:obj];

NSEnumerator *enmuerator = [muArray objectEnumerator];
id object;
while (object = [enmuerator nextObject]) {
NSLog(@"数组中的对象:%@", object);
}

[obj release];
}
return 0;
}

打印结果:
[quote]2012-07-09 16:00:26.153 objectiveC[2691:403] 数组中的对象:对象1
2012-07-09 16:00:26.154 objectiveC[2691:403] 数组中的对象:对象2
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象3
2012-07-09 16:00:26.155 objectiveC[2691:403] 数组中的对象:对象4
2012-07-09 16:00:26.156 objectiveC[2691:403] 数组中的对象:<NSObject: 0x7f91f8414110> [/quote]
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/waterseason/article/details/84631659

智能推荐

流媒体专家(6)H264协议详解II H264的分层结构与NALU介绍_h264 nalu type_奇妙之二进制的博客-程序员秘密

前面一节介绍了H264协议,主要是让大家有个基本概念,了解其基本工作原理,和一些基本术语。对于我们做应用开发而言,我们并不需要知道其压缩算法的实现细节,我们关心的是它是如何在网络上传输的。...

python3 subprocess_python3 subprocess.check_output() 乱码问题_weixin_39768695的博客-程序员秘密

大概的错误类型:- AttributeError: 'str' object has no attribute 'decode'- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc5 in position 13: invalid continuation byte大概的输出应该长这样- C:\Users\DELL&gt;E:\App\...

关于flash 部分擦除、写入的实现_flash写之前一定要擦除吗_binBlair的博客-程序员秘密

关于flash 部分擦除,部分写入的实现在工作中总是遇到关于flash操作的问题,nandflash写之前必须先擦除,擦除还必须是页擦除,就写几个字节,页擦了不全没了吗!可恶!这里记录一下自己的实现,以便日后开发,也便利大家先写一下思路:由于flash是支持从1写0,不支持从0写1,利用这一点,最终只要保证我们要擦除、或将来写数据的地址为全ff即可。判断自己需要擦除多长的地址,需要连续处理几页。准备1~2页缓冲区(这里看内存可以大),擦除。将原始数据全部存放到缓冲区。擦除原始区,将本页要擦

php 调用wcf restful,jQuery GET方法/POST方法调用RESTful WCF示例_高中数学肖博老师的博客-程序员秘密

不废话了,直奔主题吧wcf端:近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即:同时还要去掉web.config中的即类似:multipleSiteBindingsEnabled="true"/&gt;binding="webHttpBindi...

int与byte、byte[]相互转换_bytetoint_打不死的小强lee的博客-程序员秘密

一、int to byte范围在 -128 ~ 127之间可以直接转换,超出这个范围就乱了。int i = 127;byte b = (byte) i;Integer i = 127;i.byteValue();二、byte to int// byte to int (int仍有正负)static int byte2Int(byte byt){ // 直接强转 ...

随便推点

分享最新20个漂亮的支持HTML5的网站_qq_45670012的博客-程序员秘密

  作为下一代网页语言,HTML5 拥有很多让人期待已久的新特性,越来越多的网站开始支持HTML5,实现更加精美的效果。希望下面推荐的这些支持HTML5的网站实例能帮助大家更好的学习 HTML5 网站...

Vue.js + axios发post请求时后端接收不到参数解决办法_侧耳倾听...的博客-程序员秘密

前天,我用axios发送post请求的时候,后台一直接收不到我的值,于是我上网找了几种解决方法,在这里记录一下,当我们进行post 请求的时候,axios会帮我们 转换请求数据和响应数据 以及 自动转换 JSON 数据 一、URLSearchParams构造方法(推荐)register() { if (!this.form.peopleName) { th...

【C++】队列_105度西瓜的博客-程序员秘密

C++ queue(队列)Priority queue(优先队列)来源:http://blog.csdn.net/liuweiyuxiang/article/details/520882701、queue(队列)C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回...

华为鸿蒙测试图片,华为手机鸿蒙1.0测试版系统首曝光! 真机照流出: 或基于Mate40测试..._烧白滑雪的博客-程序员秘密

相信大家都知道,自从华为发布了全新自主研发的鸿蒙OS系统以来,很多消费者都非常期待华为手机能够早日搭载这款鸿蒙OS系统,但目前华为鸿蒙OS系统仅仅被搭载与华为智慧屏、华为路由器等终端产品以外,而目前最新的爆料信息显示,华为下一代PC产品也将会搭载鸿蒙OS系统,华为手机目前暂未使用鸿蒙OS系统,近日,有网友曝光了一组照片,从照片中我们能够看到,这款手机即将升级鸿蒙OS1.0.1(测试版)系统,整体系...

Linux 解决E: Sub-process /usr/bin/dpkg returned an error code (1)错误_在处理时有错误发生: python-rosdep2e: sub-process /usr/bin/d_gmHappy的博客-程序员秘密

在用apt-get安装软件时出现了类似于install-info: No dir file specified; try --help for more information.dpkg:处理 gettext (–configure)时出错: 子进程 post-installation script 返回了错误号 1 在处理时有错误发生:findutilsE: Sub-process /us...

文本格式化_zhi!q的博客-程序员秘密

文本格式化一、字体属性1、指定字体系列它的属为: font-family取值为:value1,value2,… …注意:字体取值包含中文或特殊符号,使用""引起来;还有就是取多个值是因为不知道浏览器会接受那种字体,做双重保险。ex :font-family:“宋体”,“微软雅黑” ,Arial;2、字体大小它的属性为: font-size取值为:px或pt或emex :...

推荐文章

热门文章

相关标签