昨天总结了一下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. hadoop1.2.1配置文件

    1)core-site.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" ...

  2. Shell实现跳板机,为什么用跳板机

    整理自:http://blog.chinaunix.net/uid-22101889-id-3167454.html 注意:请谨慎使用,到现在为止,使用了,我还没找到改回去的方法. 1.     问题 ...

  3. java 以及 vs 的快捷键

    javactrl+shift+y 小写ctrl+shift+x 大写ctrl+shift+f 格式化代码 vsctrl+u 小写ctrl+shift+u 大写ctrl+k+f 格式化代码

  4. (转)STL中set的用法

    转载自here 1.关于set map容器是键-值对的集合,好比以人名为键的地址和电话号码.相反地,set容器只是单纯的键的集合.例如,某公司可能定义了一个名为bad_checks的set容器,用于记 ...

  5. ExtJs布局之viewport

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  6. uva 12589 - Learning Vector

    思路: 容易知道加向量的顺序是按向量斜率的大小顺序来的.由于数据不是很大,可以用背包解决!! dp[i][j]:加入最大面积为i时,加入了j个向量. 代码如下: #include<iostrea ...

  7. 机器学习之单变量线性回归(Linear Regression with One Variable)

    1. 模型表达(Model Representation) 我们的第一个学习算法是线性回归算法,让我们通过一个例子来开始.这个例子用来预测住房价格,我们使用一个数据集,该数据集包含俄勒冈州波特兰市的住 ...

  8. dom对象详解--document对象(一)

     document对象 Document对象代表整个html文档,可用来访问页面中的所有元素,是最复杂的一个dom对象,可以说是学习好dom编程的关键所在. Document对象是window对象的一 ...

  9. lintcode:线段树的查询

    线段树的查询 对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值. 为Segmen ...

  10. Highgui.imwrite("/data/pic1111.png", mat)失败,且找不到报错

    ——> Highgui.imwrite("/data/pic1111.png", mat)失败,且找不到报错. ok -->直接使用以下代码,自己保存mat,从而可以跟 ...