---------------------- Java培训、.Net培训、Android培训、IOS培训、期待与您交流! ----------------------
OC数组跟C语言数组共同点 : 都是有序的,有下标的,不同的是OC数组只能存放OC对象,不能存放基本数据
OC数组又分两种 : 不可变数组--NSArray , 可变数组--NSMutableArray
(1) 原型 :
@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> - (NSUInteger)count; // 返回数组元素个数 - (id)objectAtIndex:(NSUInteger)index; // 以索引为参数返回对应的元素 @end
(2) 使用
注意 :
1) OC数组不能存放nil值
2) OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等
#import <Foundation/Foundation.h> int main(){ // 这个array永远是空数组 NSArray *array = [NSArray array]; /* 1.NSArray的创建 */ NSArray *array2 = [NSArray arrayWithObject:@"jack"]; // nil是数组元素结束的标记 NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil]; // [array2 count]; //NSArray *array4 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil]; // 快速创建一个NSArray对象 NSArray *array4 = @[@"jack", @"rose", @"4324324"]; /* 2.NSArray的元素个数 */ NSLog(@"%ld", array3.count); /* 3.NSArray中元素的访问 */ NSLog(@"%@", [array3 objectAtIndex:1]); //array3[1]; NSLog(@"%@", array3[0]); return 0; }
(1) 原型
@interface NSMutableArray : NSArray - (void)addObject:(id)anObject; // 添加一个元素 - (void)insertObject:(id)anObject atIndex:(NSUInteger)index; // 在数组中对应的位置添加一个元素 - (void)removeLastObject; // 删除最后一个元素 - (void)removeObjectAtIndex:(NSUInteger)index; // 根据下标删除元素 - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject; // 根据下标替换对应的元素 @end
(2) 使用 :
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person @end // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(){ NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; // 添加元素 [array addObject:[[Person alloc] init]]; [array addObject:@"jack"]; // 删除元素 //[array removeAllObjects]; // 删除指定的对象 // [array removeObject:@"jack"]; [array removeObjectAtIndex:0]; // 错误写法 // [array addObject:nil]; retturn 0; }
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person @end // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(){ Person *p = [[Person alloc] init]; NSArray *array = @[p, @"rose", @"jack"]; // 每遍历到一个元素,就会调用一次block // 并且当前元素和索引位置当做参数传给block [array enumerateObjectsUsingBlock: /* 参数 id : 当前遍历的元素 NSUInteger : 当前遍历元素的下标 BOOL * : 通过修改该参数决定是否继续遍历 */ ^(id obj, NSUInteger idx, BOOL *stop) { NSLog(@"%ld - %@", idx, obj); if (idx == 0) { // 停止遍历 *stop = YES; } } ]; retturn 0; }
NSSet 和 NSArray 的比较 :
相同点 :
(1) 都是集合,都能存放多个OC对象
(2) 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
(3) 本身都不可变,都有一个可变的子类NSMutableSet
(4) 它的遍历原理都是跟NSArray一样 : 使用block来回调
不同点 :
(1) NSArray有顺序,NSSet没有顺序
(1) 原型
@interface NSSet : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> - (NSUInteger)count; - (id)member:(id)object; - (NSEnumerator *)objectEnumerator; @end
(2) 基本使用
// 构建一个空集合 NSSet *s = [NSSet set]; // 构建一个有元素的集合 NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil]; // 随机拿出一个元素 NSString *str = [s2 anyObject]; NSLog(@"%@", str); //NSLog(@"%ld", s2.count);
(1) 原型
@interface NSMutableSet : NSSet - (void)addObject:(id)object; - (void)removeObject:(id)object; @end
(2) 基本使用
NSMutableSet *s = [NSMutableSet set]; // 添加元素 [s addObject:@"hack"]; // 删除元素 // [s removeObject:<#(id)#>];
(1) 字典跟java中的Map思想是一样的,都是一个键跟值一一对应
(2) 字典的元素是一个键值对,排列也是无序的
(3) 如果同一个key放入不同的值第一个值会被覆盖
(4) 遍历方法都是使用block
(5) 本身都不可变,都有一个可变的子类NSMutableDitionary
(6) 字典不允许有相同的key,但允许有相同的value(Object)
(1) 原型
@interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> - (NSUInteger)count; - (id)objectForKey:(id)aKey; - (NSEnumerator *)keyEnumerator; @end
(2)基本使用
// 构建一个只有一个元素的字典对象 // NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"]; // 构建一个字典 key : 一个数组 value : 一个数组 两个数组之间 key 和 value 一一对应 // NSArray *keys = @[@"name", @"address"]; // NSArray *objects = @[@"jack", @"北京"]; // NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; // 构建一个多个元素的字典对象 /* NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: @"jack", @"name", @"北京", @"address", @"32423434", @"qq", nil];*/ // 字典的快速构建 NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"}; // 依据 key 取出对应的元素 // id obj = [dict objectForKey:@"name"]; // 依据 key 取出对应的元素的 快速方式 id obj = dict[@"name"]; NSLog(@"%@", obj);
(1) 原型
@interface NSMutableDictionary : NSDictionary - (void)removeObjectForKey:(id)aKey; - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey; @end
(2) 基本使用
// 可变字典的初始化 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; // 可变字典的快速构建 // NSMutableDictionary *dict = @{@"name" : @"jack"}; // 添加键值对 [dict setObject:@"jack" forKey:@"name"]; [dict setObject:@"北京" forKey:@"address"]; [dict setObject:@"rose" forKey:@"name"]; // 移除键值对 // [dict removeObjectForKey:<#(id)#>]; // 依据 key 取出对应的元素的 快速方式 NSString *str = dict[@"name"]; //NSLog(@"%@", str); NSLog(@"%@", dict); //NSLog(@"%@", @[@"jack", @"rose"]); // 简单遍历 [dict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) { NSLog(@"%@ - %@", key, obj); // *stop = YES; }];
/* 计算代码行数 path:文件路径,绝对路径 .m .mm .c .h 返回值:该路径下文件代码行数 */ NSUInteger getFileCount(NSString *path) { // 判断路径结尾是否有 "/"存在,有则去掉 NSString *last = [path substringFromIndex:(path.length - 1)]; // NSLog(@"%@",last); BOOL isEqual = [last isEqualToString:@"/"]; if( isEqual ){ NSRange r = NSMakeRange(0, path.length - 1); path = [path substringWithRange:r]; } // 获得文件管理器 NSFileManager *fileManager = [NSFileManager defaultManager]; // 判断文件是否存在,并判断是否父路径 BOOL isFolder = NO; BOOL exist = [fileManager fileExistsAtPath:path isDirectory:&isFolder]; if( !exist ){ // 不存在则返回 NSLog(@"%@ 路径下的文件不存在",path); return 0; } NSUInteger count = 0; if( isFolder ){ // 文件夹 // 遍历该目录下所有文件 NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:path error:nil]; for (NSString *item in fileArray) { // 拼接子路径 NSString *subPath = [NSString stringWithFormat:@"%@/%@", path,item]; count += getFileCount(subPath); } return count; } else { //文件 // 只计算 .m .h .c .mm NSString *extension = [path pathExtension]; if( ([extension isEqualToString:@"m"]) || ([extension isEqualToString:@"h"]) || ([extension isEqualToString:@"c"]) || ([extension isEqualToString:@"mm"])){ // 获得文件内容 NSString *content = [NSString stringWithContentsOfFile:path encoding:(NSUTF8StringEncoding) error:nil]; // 以\n作为分隔符把文本分隔 NSArray *array = [content componentsSeparatedByString:@"\n"]; return count += array.count; } return 0; } }
(1) 集合都是可以放入任何OC对象,对于非OC对象不能放进集合里面
(2) 集合本身不可变,但都有一个可变大小的子类
(3) 集合遍历思想都是通过回调block来控制实现
(4) 集合的父类都是 NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
---------------------- Java培训、.Net培训、Android培训、IOS培训、期待与您交流! ----------------------
详情请查看:http://edu.csdn.net/heima