iOS-数据结构

一.     在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:方法计算时区导致的时差