昨天总结了一下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. sql盲注及其相关方法

    Sql注入过程数据(后台数据不能回显到页面)不回显采用方法 1:构造逻辑判断 ▲left(database(),1)>’s’             //left()函数 ▲and ascii( ...

  2. 容器字段FieldContainer

    //Ext.form.FieldContainer扩展自Ext.container.Container.当需要把多个字段或组件作为一个表单项展示的时候就需要此组件          Ext.Quick ...

  3. Win8必知快捷键汇总

    * Win+C:调出应用Charm菜单(开始界面.传统桌面) * Win+D:所有程序最小化,再次按下恢复(开始界面.传统桌面) * Win+E:打开我的电脑(开始界面.传统桌面) * Win+F:调 ...

  4. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  5. js正则表达式用法大全

    匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一 ...

  6. JDBC第四次学习

    传智播客李勇老师的JDBC系列学习终于接近尾声了,好开心,能学到这么多的东西,还不赶快记录下来,留待以后回味! 如何使用开源项目DBCP(实际项目中常用)    主要分为三个步骤: 使用DBCP必须用 ...

  7. vim中如何引用自定义模板文件

    我们在使用vim新建文件时可以引用自定义模板,来避免重复的数据格式处理花费太多时间. 实现方法很简单,只需要2步即可:1. 在.vim/template目录放入自己的模板文件(如shellconfig ...

  8. C++ std命名空间

    1.命名空间是一种特殊的作用域,它包含了处于该作用域中所有标示符.命名空间使用namespace 来声明,并使用{}来界定命名空间的作用域,例如: namespace func{ int val=0; ...

  9. iOS开发--UITableView

    -.建立 UITableView  DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];  [Data ...

  10. iOS开发--验证码

    第一步,拖两个空间textfiled和button到storyboard上的viewcontroller上. 第二步,拖线,链接到.h文件中代码如下: 1 @property (weak, nonat ...