昨天总结了一下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. vi编辑器的常见使用技巧

    光标移动 在普通模式下, 1.按 h 向左移动光标 按 h + 数字n 可以向右移动 n个字符   比如 h + 5  就是向左移动5个字符 2.按j向下移动光标 3.按k向上移动光标 4.按 l 向 ...

  2. 2014ACM-ICPC 西安赛区总结

    万万没想到,打铁了.以前一直觉得拿铁咖啡的梗是很好笑的,然后有一天这杯咖啡自己喝下去了,就会发现心里真的被梗住了. 复旦的题其实我是有预料到的,前年的复旦题三题从金区到铜区都有,但是从去年的南京赛区开 ...

  3. 动态调用wcf接口服务

    1.url:http://localhost:8002/名称.svc/basic(.svc结尾) 2.需要引用的命名空间System.ServiceModel 3.调用代码: public class ...

  4. x64 结构体系下的内存寻址

    欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4735027.html 在阅读NewBluePill源码的时候,看内存的那一块简直头疼,全是x6 ...

  5. angularJS之$watch、$digest和$apply方法

    最近项目上使用了比较多的angular JS,一直都对它感觉比较陌生,总觉得有点反直觉,这段时间,准备下定决心弄明白,这个框架到底是怎么一回事,以及它的工作原理,生命周期……一点一点的啃完它吧.首先, ...

  6. Eclipse调试Java的十个技巧

      先提三点 不要使用System.out.println()作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志   1.条件断点 想象一下我们平时如何添加断点,通常的做法是 ...

  7. Hadoop基础教程之高级编程

    从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2 ...

  8. JavaWeb项目开发案例精粹-第4章博客网站系统-001设计

    1. 2. 3. # MySQL-Front 5.0 (Build 1.0) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET SQL_MO ...

  9. Sublime Text 2安装汉化破解、插件包安装教程

    原文地址: Sublime Text 2安装汉化破解.插件包安装教程_百度经验 http://jingyan.baidu.com/article/ff4116259b057c12e48237b8.ht ...

  10. LabelMe图像数据集下载

    Download MATLAB Toolbox for the LabelMe Image Database 利用Matlab Toolbox工具箱下载图像库 一.下载Matlab Toolbox工具 ...