昨天总结了一下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的更多相关文章

  1. 13.Object-C--浅谈Foundation框架常用的结构体

    ------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...

  2. 14.Object-C--浅谈Foundation框架字符串NSString 与NSMutableString

    OC的字符串时经常使用到的,今天我对于OC字符串做一个简单的总结,如果有错误之处,麻烦留言指正.感谢! NSString是一个不可变长度的字符串对象.表示它初始化以后,你不能改变该变量所分配的内存中的 ...

  3. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  4. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  6. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  7. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  8. (转载)OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    在之前的一篇文章中介绍了Foundation框架中的NSString类和NSMutableString类,今天我们继续来看一下Foundation框架中的NSArray类和NSMutableArray ...

  9. OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...

随机推荐

  1. Sqli-labs less 61

    Less-61 此处对于id处理还是有点奇葩的,第一次遇到利用两层括号的.(可能我头发比较长,见识短了).形式和上述是一样的 payload: http://127.0.0.1/sqli-labs/L ...

  2. linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)

    linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制) 发表于2012//07由feng linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,ac ...

  3. php调试工具firephp

    PHP调试有很多中方法.今天给大家推荐的是 FirePHP 这个工具,是基于firefox的一个组件.Firephp组件安装地址.使用之前需要先安装下这个组件.完了还需要down一个FirePHP的包 ...

  4. 从xml文件中读取注释

    void Main() {     string dirp=@"E:\Cread\UP4201308.bak\UP4.BAK\ExportPath\ConfigFile\";   ...

  5. POJ 3335 Rotating Scoreboard(半平面交求多边形核)

    题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...

  6. shell脚本执行查找进程,然后查杀进程

    shell 执行查找进程,然后查杀进程脚本如下: ps -ef | grep 'IOE' |grep -v 'grep'| awk '{print \$2}' |while read pid; do ...

  7. 【poj2778-DNA Sequence】AC自动机+矩阵乘法

    题意: (只含AGCT)给定m个病毒串,让你构造一个长度为n的字符串(也只含有AGCT),问有多少种方案.n很大:1<=n<=2000000000 题解: 用病毒串建立AC自动机(num个 ...

  8. JLink 软件复位、Halt及运行小工具

    调试硬件时常常需要复位目标芯片,每次断电上电太麻烦,又不喜欢总打开segger的命令行,于是就搞了这个小工具:   QT绿色软件,解压即可运行,打开JLinkRST.exe,点击Connect即可通过 ...

  9. Axure 注册码

    用户名:axureuser 序列号:8wFfIX7a8hHq6yAy6T8zCz5R0NBKeVxo9IKu+kgKh79FL6IyPD6lK7G6+tqEV4LG

  10. 一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)

    版权声明:本文为博主原创文章,未经博主允许不得转载. BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lp ...