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 ...
随机推荐
- POJ 2153 Rank List (map映射)
水题,竟然花了那么多时间...主要是不知道为什么,明明在本机上编译过去了,但是用c++提交却编译错误...最后用g++提交AC 题意:给出n个学生的名字,然后给出m个测验. 每个测验给出n个学生的分数 ...
- iOS警告-Warning: Error creating LLDB target at path(模拟器警告)
Warning: Error creating LLDB target at path '/Users/apple/Library/Developer/Xcode/DerivedData/Observ ...
- Difference Between Vector and Deque in C++
1) Dequeue can quickly insert or delete both at the front or the end. However, vector can only quick ...
- 树莓派/RaspberryPi 内核编译
1.获取所需源码 1)下载地址: 官方网址:https://github.com/raspberrypi 上面列出了树莓派所有的开源软件: linux:内核源码 tools:编译内核和其他源码所需的工 ...
- Full GC有关问题学习分析(转载)
网站持久代引发Full GC问题分析 现状: Dragoon(监控系统)的日报显示trade_us_wholelsale(美国wholesale集群),日均Young GC次数25w次左右,应用暂停2 ...
- Tomcat6启用Gzip压缩功能
配置Tomcat根目录下/conf/server.xml文件: <Connector port="8080" protocol="HTTP/1.1" co ...
- php 修改 AppServ 下Apache 端口
php 修改 AppServ 下Apache 端口 步骤一:把 C:\AppServ\Apache2.2\conf 中httpd.conf修改了 还不正确 步骤二:把httpd.conf 中List ...
- C#程序重启自己
Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location); Application.Exit();
- Java-J2SE学习笔记-查找一个String中,subString的出现次数
1.查找一个String中,subString的出现次数 2.代码 package Test; public class TestStringContain { public static void ...
- VCL定义和使用CM_Message的原因(主要是内部控制,同时可简化参数传递,还可截住消息,统一走消息路线,还可省内存)
内部控制是指,做了某些操作后产生某些效果,但是Windows系统本身不提供这样的消息,应此不得不自定义.比如父窗口改变了字体,那么所有子窗口也都应该改变字体,至少也得通知一下它们,让子控件自己决定是否 ...