iOS开发——OC常用的数据结构一览。
一. 在iOS开发中常用的结构体
1. NSRange-一个范围结构体,location是位置,length是长度;{4,5},NSMakeRange(4,5);NSStringFromRange可以把它当NSString*返回
2. NSSize-由一个CGSize被typedef过来,CGFloat是double类型typedef过来的,也由两个值组成:with宽度,height高度;{21,19};也可以NSMakeSize(21,19);NSStringFromSize可以由它返回一个NSString*返回
3. NSPoint-有一个CGPoint被typedef过来的,由两个值组成:一个x值,一个y值;{0,0}或者NSMakePoint(0,0);NSStringFromPoint可以把它返回一个NSString*
4. NSRect-是CGRect被typedef过来,由一个CGPoint和一个CGSize组成;{0,0,100,200}或者NSMakeRect(0,0,100,200);NSStringFromRect返回一个描述它的String*
二. 基本数据类型的包装类
1. 什么是基本数据类型的包装类:NSNumber它是一个类,继承于NSValue,可以用numberWithxxx把xxx基本类型入参返回一个NSSNumber类型的指针,可以用%@打印NSNumber;也可以用xxxValue方法把当前NSNumber返回一个xxx类型的基本数据
2. 好处:可以直接转字符串不用记住那么多打印的%格式;
3. 数组,集合中不允许存储基本数据类型,如果想让数组,集合中存储基本数据类型,就必须要把基本数据类型包装成NSNumber类
三. 集合类
1. NSArray,NSDictionary,NSSet都是用来打包数据的,统称为集合类
2. 他们会有增删改查的基本功能,也都是类对象
3. NSArray不可变,NSMutableArray可变;不可以在NSArray中存储nil,因为nil代表结束;
4. NSArray实际上存储的是地址,也可以继续存储NSArray*,也就变成类一个二维表,每次打印NSArray时都是调用内部对象的description方法
5. 如果要在数组中存储基本数据类型一定要包装为NSNumber,否则会存储进乱码
6. 2013年新加入了@[]方式初始化一个NSArray,也可以快速获取NSArray中的对象array[index];
7. #pragma mark xxx就可以在.m文件定义一个标记,可以快速定位到标记的地方
8. 初始化一般用initWithObjects:,而获取一般用objectAtIndex:方法
9. count方法可以获得数组中元素的个数
10. 判断NSArray中是否存在某个对象:containsObject:返回BOOL
11. 增强for循环:for(NSObject*obj in array){}
12. 在实际的开发当中,单个数组一般都是只用来存放一种对象,因为遍历数组时如果调用某个对象特有的方法时会引起异常
13. 枚举器:objectEnumerator方法返回一个NSEnumerator类型的对象,也就是我们的枚举器对象。while(value = [enumerator nextObject]){}当nextObject在NSArray的*后一个对象为nil时就不再执行了
14. NSArray的排序:1使用sortedArrayUsingSelector,[arraysortedArrayUsingSelector:@selector(compare:)]; 2使用block排序,[arraysortedArrayUsingComparator:^NSComparisonResult: (id obj1, obj2){return[obj1compare: obj2]}];obj1,obj2反过来就是倒叙;
15. 自定义类数组的排序:如果你想对自己定义的对象所存的数组进行排序,要新建一个NSSortDescriptor对象,NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: @”age”ascending:YES];其中@”age”就是你想要排序的主键,在把NSSortDescriptor对象放入一个NSArray中,之后调用[array sortedArrayUsingDescriptors:数组]为什么是数组呢?因为它支持多字段排序,前面的键优先级高。
16. 其实用block排序同样可以实现对自定义类数组的排序,比较方法要自己在block中写
17. NSMutableArray,同样是继承自NSArray;同样有增删改查addObject:obj,insertObject:obj atIndex:index,removebject:obj会删除数组中所有同地址对象。还有removeObjectAtIndex:index方法,注意index如果超出范围就会导致异常
18. 数组中可以存储同一个地址多次
19. removeAll是清空整个数组
20. 在遍历可变数组时,千万不要更改数组的count,否则可能引起程序错误或者引发异常
21. 如果非要删除数组中的对象,那么可以先声明一个NSMutableArray,在遍历NSArray同时删除NSMutableArray中的对象就可以了;
22. NSDictionary,字典类,不可变;
23. 初始化字典:[dictionaryWithObjectsWithKeys:@”value”,@”key”…,nil],也可以@{@”key1”:@”value1”,@”key2”:@”value2”,…};
24. 字典中可以存放任意的数据类型,基础数据类型同样要求封装为NSNumber之后存储
25. 字典中的顺序不和数组顺序一样时自然顺序
26. 字典内同样可以存放字典类型,类似NSArray,其实字典中存放的也是对象的指针存放的地址
27. 字典一样有count,一样是字典中字典项的个数
28. 取值,[dictobjectForKey:@”key”],键对应的值是什么类型就用什么类型的指针去接收即可
29. 遍历方式,首先要取出所有key,然后遍历key组成的NSArray,在循环体之中用[objectForKey:@”key”]单独获取当前遍历到的value即可实现
30. 如果你的字典中存储类多种不同类型,那么注意点和NSArray几乎一样
31. NSMutableDictionary,继承自NSDictionary,可以变换的字典;
32. 有增删改查,[setObject:objforKey:key]为key设置obj的值,[removeObjectForKey:key]方法用来删除给定key键的obj对象值,[removeAllObjects]清空字典;
33. 遍历,普通for,增强for,枚举器while遍历同上,都是类似的。
34. NSSet*大的功能就是它不可以存储相同的对象多次,同样不可变
35. NSMutableSet,可变集合,继承自NSSet。addObject:添加元素,removeObject:删除元素removeAllObject清空集合
36. 遍历NSMutableSet,NSEnumerator* en = [muset objectEnumerator];然后用nextObject实现遍历
37. 集合类之间的相互转换:NSXxx转换NSMutableXxx,xxxWithXxx:方法就可以实现
38. NSDictionary à NSArray:allKeys,allValues分别生成俩数组
39. 字符串转换成NSArray:componentsSeparatedByString:@”.”方法
40. 集合的手动内存管理:当你把对象存入到数组中的时候,数组会对这个对象进行一次retain操作,在数组removeObject:的时候会对这个对象进行一次release操作,使得retainCount正常。同样的,清空数组会对数组内的每个元素发送release消息。调用数组的release方法也是会对每个元素发送release消息
41. ARC机制下的集合内存管理:当你把对象存入到数组中时,它对对象进行一次strong指针保存,当数组removeObject或者removeAllObjects时会释放这个strong指针。同样的道理,数组调用= nil的时候,也同样会释放所有的strong指针。这样当元素 = nil的时候系统就自动回收元素了;
42. 所以ARC机制之中还是要担心内存溢出了
四. 文件管理器
1. 文件操作:NSFileManager,文件管理器,通过创建使用这个对象的方法来进行文件操作。
2. NSFileManager * file =[NSFileManager defaultManager];获得文件管理器对象,且它是单实例模式。
3. 如果要模仿这种单实例的话,要在类方法中实现一个静态变量static NSObj* instance = nil;这个静态变量会在main函数结束才销毁,defaultObj方法只需要判断如果这个静态变量为nil就新建一个,否则直接返回这个静态变量即可;
4. 用%p可以打印对象的指针地址,同样NSFileManager也可以alloc,init来创建一个新的NSFileManager;
5. 获取文件属性:获取NSFileManager对象,&error入参来获取错误信息,然后通过attributesOfItemXxx:方法返回一个NSDictionary对象,里面是返回的文件信息;
6. 获取文件中的子集:contentsOfDirectoryAtPath:方法获取路径下的含有的子文件,只能够获得目标目录下一级的目录!如果想要打出给定路径下包含的所有子文件以及子文件内的文件,要用subpathsOfDirectoryAtPath:方法实现。
7. 创建一个文件夹:调用NSFileManager对象的createDictionaryAtPath:方法就是可以实现创建,第二个参数会逐级的创建文件夹,如果为No的话没有上级目录则会报错
8. 如何移动目录:调用NSFileManager对象的moveItemAtPath: toPath:方法实现
9. 删除目录:调用NSFileManager对象的removeItemAtPath:方法实现
10. 复制文件:调用NSFileManeger对象的copyItemAtPath:toPath:方法实现
11. 只要是文件,不论格式基本都可以使用NSData对象接收
五. 数据NSData
1. NSData是你要加载不同格式文件时要使用的数据类型,这是专门用来处理文件数据的数据类型
2. NSMutableData,可变数据类,继承自NSData类,用法类似于NSData
六. 日期操作
1. NSDate,日期数据类型,初始化直接date方法就可以
2. 日期的比较:首先NSTimeInterval其实是一个double类型,可以在当前日期调用addTimeInterval:方法加上这个数据类型获得一个相差这么长时间段的NSDate对象,对了,NSTimeInterval是以秒计数;如果要减去就加上一个负的NSTimeInterval
3. isEqualToDate:是否相同;earlierDate:比较早的时间;laterDate:比较晚的时间;
4. 格式化日期:NSDateFormatter就是一个日期格式化对象数据类型,调用NSDateFormatter的setDateFormat:方法。例如:@”yyyy/MM/dd hh:mm:ss”让后用NSString的stringFromDate方法即可
5. 这个格式化的hh代表12时制,HH代码24时制
6. 处理时区问题:调用NSDateFormatter的setTimeZone:方法计算时区导致的时差