15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray
昨天总结了一下NSString与NSMutableString,今天我在这里总结一下NSArray与NSMutableArray。
NSArray数组是:不可变数组。 nil 是数组元素结束的标记。OC数组中不能存放nil值。
NSMutableArray是可变数组。
同时在OC数组中不能存放非OC对象的数据类型,比如:int 、struct、 enum等类型。
下面开始说一下NSArray数组。
(1).数组的创建 arrayWithObject arrayWithObjects
- //NSArray 的创建 创建一个元素 arrayWithObject:
- NSArray * array1 = [NSArray arrayWithObject:@"test"];
- NSArray *array2 = [NSArray arrayWithObject:@"QYMa"];
- NSArray *array3 = [NSArray arrayWithObject:@"hahha"];
- //创建多个元素,要以nil结素
- NSArray *array4 = [NSArray arrayWithObjects:@"test",@"QYMa",@"hahha", nil];
(2).获取数组某个元素的方法 objectAtIndex 或者直接使用下标 例如:array[i]
- //获取第2个元素
- NSString *str = [array4 objectAtIndex:];
- NSLog(@"%@",str);
- //快速获取某个元素 获取第二个
- NSString *str1 = array4[];
- NSLog(@"str1 = %@",str1);
(3).快速创建NSArray数组的方法 @[];由于返回的是NSArray所以这个方法只适用于NSArray,不使用于NSMutableArray
- //快速创建NSArray 数组
- NSArray *array5 = @[@"test1",@"test3"];
(4).获取数组元素中的个数 count
- //获取数组元素的个数
- NSUInteger num = [array4 count];
- NSUInteger num1 = array4.count;
下面重点说一下数组遍历的4中方式:
(1).普通for(){}循环遍历,示例代码如下:
- Person *p = [[Person alloc]init];
- NSArray *array1 = [NSArray arrayWithObjects:p,@"test",@"QYMa",nil];
- //1.使用普通for循环
- NSUInteger cout = array1.count;
- for(int i = ; i < cout; i++)
- {
- NSLog(@"array1[%d] = %@",i,array1[i]);
- }
(2).使用增强for循环 for (<#type *object#> in collection);
type 就是元素的数据类型,都是对象类型,所以使用id;
*object 是对应元素的变量名称;
collection 就是你要遍历的集合;
示例代码如下:
- for (id obj in array1)
- { //获取obj所在的下标
- NSLog(@"array1[%ld]= %@",[array1 indexOfObject:obj],obj);
- }
- NSLog(@"———————我是逗比的分割线———————");
(3).使用迭代器 NSEnumerator
NSEnumerator用来描述这种集合迭代运算的方式。通过objectEnumerator向数组请求枚举器,如果想从后向前浏览集合,可使用reverseObjectEnumerator方法。在获得枚举器后,可以开始一个while循环,每次循环都向这个枚举器请求它的下一个对象:nextObject。nextObject返回nil值时,循环结束。
示例如下:
- //3.使用迭代器 遍历数组
- NSEnumerator *enumerator = [array1 objectEnumerator];
- id flag;
- while (flag = [enumerator nextObject])
- {
- NSLog(@"array1 = %@",flag);
- }
- NSLog(@"———————我是逗比的分割线———————");
(4).使用代码块 遍历数组 enumerateObjectsUsingBlock
id obj 对应的元素;
NSUInteger idx 元素所在下标;
BOOL *stop 跳出循环的条件是 stop为YES;
- [array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
- {
- NSLog(@"array1[%ld] = %@",idx,obj);
- }];
说完了数组的遍历我们来说说,NSMutableArray可变数组。
看如下代码:
- NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"test",@"test1",nil];
- //2.删除元素
- [mArray addObject:@"test2"];
- [mArray addObject:@"test3"];
- //3.获取元素个数
- NSUInteger counts = mArray.count;
- NSLog(@"%ld-- %@",counts,mArray);
- //4.根据下标删除元素
- [mArray removeObjectAtIndex:];
- //5.删除index 位置的所有元素
- // [mArray removeObjectsAtIndexes:<#(NSIndexSet *)#>];
- //6.删除最后一个元素
- [mArray removeLastObject];
- //7.删除所有元素
- [mArray removeAllObjects];
- //8.删除特定元素
- [mArray removeObject:@"test"];
- //9.在range 范围内查找特定的元素删除
- //[mArray removeObject:<#(id)#> inRange:<#(NSRange)#>];
- //10.删除同时存在于otherArray 和当前集合中的所有元素
- //[mArray removeObjectsInArray:<#(NSArray *)#>];
- //11.删除range范围内的所有元素
- // [mArray removeObjectsInRange:<#(NSRange)#>];
下面通过昨天的字符串和今天数组的总结,做一个小练习,获取文件(夹)中的代码行数。
代码如下:
- #import <Foundation/Foundation.h>
- /*
- 计算单个文件的代码行数
- path:文件的全路径
- 返回值 代码行数
- */
- int codeLineCounts(NSString *path)
- {
- //判断文件的后缀pathExtension 并转化为小写
- NSString *extension = [[path pathExtension]lowercaseString];
- //判断文件后缀是否是m
- if (![extension isEqualTo:@"m"])
- {
- return ;
- }
- //1.从文件中读入内容存入到字符串中
- NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
- //2.通过字符分割,将分割好的内容存入到数组中
- NSArray * array = [content componentsSeparatedByString:@"\n"];
- //3.数组的大小就是 文件的代码行数
- NSUInteger counts = array.count;
- //4.将路径/Users/mqy/Desktop/练习代码/ 替换为空
- NSString *subPath = [path stringByReplacingCharactersInRange:[path rangeOfString:@"/Users/mqy/Desktop/练习代码/"] withString:@""];
- //输出文件路径和代码行数
- NSLog(@"%@ --%ld",subPath,counts);
- return (int)counts;
- }
- /*
- 计算文件或者文件夹里面的代码行数
- */
- NSUInteger codeLineCount(NSString *path)
- {
- //1.首先获得文件管理者
- NSFileManager *mger = [NSFileManager defaultManager];
- //2.判断路径的有效性,路径是否存在,不存在return
- BOOL dir = NO;//标记是否为文件夹
- BOOL exist = [mger fileExistsAtPath:path isDirectory:&dir];
- //3.如果路径不存在log输出 return
- if(!exist)
- {
- NSLog(@"文件路径不存在,请查看");
- return ;
- }
- //4.如果路径存在判断是文件夹 还是文件 dir为yes 则为文件夹
- if (dir)
- {
- int count = ;
- //5.如果是文件夹,遍历文件夹获取文件夹里面信息
- NSArray *contentList = [mger contentsOfDirectoryAtPath:path error:nil];
- //6.遍历数组
- for (NSString *fileName in contentList)
- {
- //7.获取文件的全路径
- NSString *fullPath = [NSString stringWithFormat:@"%@/%@",path,fileName];
- //8.获取文件下的代码行数 SUM
- count += codeLineCount(fullPath);
- }
- return count;
- }else
- {
- return codeLineCounts(path);
- }
- return ;
- }
- int main(int argc, const char * argv[])
- {
- NSString *path = @"/Users/mqy/Desktop/练习代码";
- NSUInteger lineCounts = codeLineCount(path);
- NSLog(@"代码行数是:%ld",lineCounts);
- return ;
- }
今天的内容不是特别多,就先总结到这里,后期遇到问题,我再继续总结,如果有什么错误之处,麻烦留言指正!感谢!
15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray的更多相关文章
- 13.Object-C--浅谈Foundation框架常用的结构体
------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...
- 14.Object-C--浅谈Foundation框架字符串NSString 与NSMutableString
OC的字符串时经常使用到的,今天我对于OC字符串做一个简单的总结,如果有错误之处,麻烦留言指正.感谢! NSString是一个不可变长度的字符串对象.表示它初始化以后,你不能改变该变量所分配的内存中的 ...
- 手撸ORM浅谈ORM框架之基础篇
好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...
- OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类
我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...
随机推荐
- hadoop安装问题
1. 运行start-dfs.sh启动HDFS守护进程,start-yarn.sh面向YARN的资源器和节点管理器,资源管理器web地址是http://localhost:8080/.输入stop.d ...
- POJ 1496
#include <iostream> #include <string> using namespace std; int fac(int num); int C(int n ...
- ZOJ题目分类
ZOJ题目分类初学者题: 1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...
- **app后端设计(10)--数据增量更新(省流量)
在新浪微博的app中,从别的页面进入主页,在没有网络的情况下,首页中的已经收到的微博还是能显示的,这显然是把相关的数据存储在app本地. 使用数据的app本地存储,能减少网络的流量,同时极大提高了用户 ...
- Linux网络编程10——使用UDP实现五子棋对战
思路 1. 通信 为了同步双方的棋盘,每当一方在棋盘上落子之后,都需要发送给对方一个msg消息,让对方知道落子位置.msg结构体如下: /* 用于发给对方的信息 */ typedef struct t ...
- linux ps命令详解
ps工具标识进程的5种状态码: D 不可中断 uninterruptible sleep (usually IO) R 运行 runnable (on run queue) S 中断 sleeping ...
- Android:开发环境
一.JAVA SDK(JDK)的安装 http://www.cnblogs.com/tinyphp/p/3664598.html 二.ADT-Bundle 包含了Eclipse.ADT插件和SDK T ...
- Java:多线程之生产者与消费者
要求:用两个线程模拟存票.售票过程.但要求每存入一张票,就售出一张票,售出后,再存入,直到售完为止. 用到的知识点:线程等待.唤醒.可能的线程中断异常 下面的方式一和方式二采用的是唤醒所有等待的线程, ...
- logstash_agent.conf 语法注意事项
编写配置文件时要注意语法,如新版本的logstash对参数host变更为hosts,去除了port参数等. [root@localhost logstash]# cat logstash_agent. ...
- Data Flow ->> Script Component
和Control Flow中的Script Task非常类似,不同的是Script Component是Per-Row的执行类型.打个比方,在Script Component中加入两个Output的字 ...