Foundation框架包含了大量的基础的、工具类,这些工具类既然是Cocoa开发的基础,也是Cocoa Touch开发的基础。
如果程序导入Cocoa框架,实际上也就导入了Foundation框架;对于iOS开发,如果导入了UIKit框架,实际上也导入了Foundation框架。
字符串类:NSString(不可变)和NSMutableString(可变的)
NSString
↑继承
NSMutableString
NSString能支持的功能,NSMutableString都可以支持。
创建NSString
- 根据format来创建
- 根据C字符串来创建。
- 读取文件来创建。
转换
可以把Object-C字符串,转换成C的字符串。
也可以把Object-C的字符串,输出到文件中。
工具方法:
包含字符串是否以XX开头、以XX结尾,是否包含YY子串。
可变字符串:NSMutableString
对于NSString而言,它所包含的字符序列是不能改变的,
NSMutableString可以增加、删除、替换、插入等操作。
说明:如果程序经常需要对字符串的内容进行修改,那么使用NSMutableString会更加合适。
如果你用NSString对象,程序每次修改一次字符串,程序就需要重新创建一次NSString对象,这样内存开销非常大
日期相关类 NSDate
NSDate: 代表了日期、时间点。
计算两个时间之间相差的秒数。
NSDateFormatter - 完成NSDate与NSString之间的相互转换
NSDateFormatter的作用就是:
stringFromDate:
NSDate ---> NSString
<-----
dateFromString:
NSDateFormatter有两种用法:
1 - 按固定格式输出,分别为dateStyle、timeStyle指定属性值:no、short、medium、long、full。
2 - 按自定义的格式输出。 需要指定dateFormat属性,该属性值应该是一个格式化字符串。
yyyy MM dd HH/hh mm ss
NSDateComponents:可用于提取日期的指定字段(年、月、日、时、分、秒等)的值.
该类通常要和NSCalendar结合使用。
NSCalendar的方法
components:fromDate: :从指定NSDate中提取指定字段(年、月、日、时、分、秒等)的值.
dateFromComponents: :根据指定字段(年、月、日、时、分、秒等)的值来恢复NSDate对象。
NSTimer:定时器。
可以周期性地执行某个方法。比如控制程序每隔多长时间去执行某个方法。
NSTimer通常需要图形界面上执行。
scheduledTimerWithTimeInterval: 多少秒
target:谁
selector:方法
userInfo:nil
repeats:YES
控制每隔多少秒,执行谁的方法一次。 最后一个参数控制是否重复。
对象拷贝(复制)
copy和mutableCopy
copy拷贝得到总是不可变的副本(如果该类有可变类和不可变类的两个版本),即使原对象是可变的。
mutableCopy拷贝得到总是可变的副本(如果该类有可变类和不可变类的两个版本),即使原对象是不可变的。
自定义类的拷贝操作
1. 如果希望自定义类的实例可调用copy方法,那么该类要遵守如下两个要求:
A。该类必须实现copyWithZone:方法 —— 因为当程序调用对象copy方法时,实际上是执行了copyWithZone:方法。
B。建议让该类遵守NSCopying协议 —— 可选的。
可变类(mutable class)与不可变类(immutableclass)
不可变类:当该类的实例被创建出来之后,如果该类的所有成员变量的值都永远不能被改变,该类就是不可变类。
反之就是可变类。
如何设计可变类:要么它的成员变量可以直接被赋值,要么该成员变量有对应的setter方法
——这说明它的成员变量是可以被改变的,因此该类就是可变类。
如何设计不可变类:所有成员变量被隐藏起来,成员变量只有getter方法、没有setter方法,
——这说明它的成员变量是不可以被改变的,因此该类就是不可变类。
2. 如果希望自定义类的实例可调用mutableCopy方法,那么该类要遵守如下两个要求:
A. 该类必须实现mutableCopyWithZone:方法 —— 因为当程序调用对象mutableCopy方法时,
实际上是执行了mutableCopyWithZone:方法。
B. 建议让该类遵守NSMutableCopying协议 —— 可选的。
如果你自定义的类,本身就只有一个可变版本。此时实现该对象的拷贝时,就无需区分copy和mutableCopy。
只有当你自定义的类有可变版本和不可变版时,此时就需要严格实现该类的copy和mutableCopy方法。
其中copy方法返回的总是不可变版本;mutableCopy方法返回的总是可变版本。
深拷贝和浅拷贝
浅拷贝:当拷贝对象时,如果对象属性是指针,程序只是复制该指针的值,并未为指针所指的对象复制副本。
因此被拷贝对象与拷贝的新对象会共同指向某个对象。
深拷贝:当拷贝对象时,如果对象属性是指针,必须把该指针所指向的对象都要复制一份副本。
而且深拷贝还需要递归——直到对象所有成员变量不再是指针。
——深拷贝很难实现。
如果真要深拷贝,会通过归档的方式来实现深拷贝。
setter方法的复制选项。
@property合成属性时,可指定一个copy选项。
—— 该copy选项控制,当程序对该属性赋值时,实际上被赋的值只是它的副本,而不是它本身。
由此可见,只有当该属性的类型本身是可拷贝(copyWithZone:方法、NSCopying协议)的,此时才可用copy选项