1 字符串
NSString, Cocoa中用来处理字符串的类。字符串其实就是一组人类刻度的字符序列。由于计算机与人类进行定期交互,因此最好让它们有一个可以存储和处理人类可读文本的方式。NSString型数据,特殊的NSString字面量,其标志为双引号内字符串前面的@符号。与OC不同,C语言将字符串作为简单的字符数组进行处理,并且在数组最后添加尾部的零字节作为结束标志。
1.1 创建字符串
NSString的StringWithFormat:方法是通过接受格式字符串和参数来创建NSString的。
+(id)stringWithFormat: (NSString *)format, ......;
1.2 类方法
stringWithFormat:的声明中有两个值得注意的地方。第一个是定义最后的省略号(...), 它告诉我们和编译器这个方法可以接受多个以逗号隔开的其他参数。第二个就是声明语句中的起始字符:一个+号。Objective-C运行时生成一个类的时候,会创建一个代表该类的类对象(class object)。类对象包含了指向超类、类名和方法列表的指针,还包含一个long类型的数据,为新创建的实例对象指定大小(以字节为单位)。
如果你在声明方法时添加了加号,就是把这个方法定义为类方法(class method)。这个方法属于类对象,而不是类的实例对象,通常用于创建新的实例。我们称这种用来创建新对象的类方法为工厂方法(factory method)。
stringWithFormat:就是一个工厂方法,它根据你提供的参数创建新对象。用stringWithFormat:来创建字符串比创建空字符串然后生成所有元素要容易得多。
类方法也可以用来访问全局数据。AppKit(基于OS X平台)中的NSColor类和UIKit(基于iOS平台)中的UIColor类都拥有以各种颜色命名的类方法。
一般在开发中创建的大部分方法都是实例方法,要用减号(—)作为前缀来进行声明。这些方法将会在指定的对象实例中起作用。如果某个方法实现的是很通用的功能,比如创建一个实例对象或者访问一些全局类数据,那么最好使用加号(+)作为前缀将它声明为类方法。
1.3 关于大小
NSString中有一个实例方法是length,它返回的是字符串中的字符串个数。
NSString的length方法能够精确无误地处理各种语言的字符串,如含有俄文、中文或者日文字符的字符串,以及使用Unicode国际字符标准的字符串。
1.4 字符串比较
isEqualToString:可以用来比较接收方(receiver, 接收消息的对象)和作为参数传递过来的字符串。isEqualToString: 返回一个BOOL值(YES或NO)来表示两个字符串的内容是否相同。它的声明如下。
-
(BOOL)isEqualToString:(NSString *)aString;
使用方式如下:
要比较两个字符串,可以使用compare:方法, 其声明如下:
-
(NSComparisonResult)compare:(NSString *)aString;
compare:将接收对象和传递过来的字符串逐个进行比较,它返回一个NSComparisonResult(也是一个enum型枚举)来显示比较结果,有升序(NSOrderedAscending)、相等(NSOrderedSame)和降序(NSOrderedDescending)三种情况。类似于C语言中的函数qsort()或bsearch(), 这个方法主要用来排序。如果compare: 返回的结果是NSOrderedAscending,那么左侧的数值就小于右侧的数值,即比较的目标在字符表中的排序位置比传递进来的字符串更靠前。
注意点:正确比较字符串
比较两个字符串是否相等时,应该使用isEqualToString: ,而不能仅仅比较字符串的指针值,举个例子:
两种比较方式不同。这是因为==运算符只判断thing1和thing2的指针数值,而不是它们所指的对象。由于thing1和thing2是不同的字符串,因为OC中的对象是动态分配内存,所以thing1和thing2的内存地址是随机分配的,因此它们的指针数值是不一样的。所以第二种比较方式会认为它们是不同的。
因此,如果你想检查两个对象(thing1和thing2)是否为同一事物,就应该使用运算符==。如果是想查看是否相等(即这两个字符串是否内容相同),那么请使用isEqualToString: 。
1.5 不区分大小写的比较
compare: 进行的是区分大小写的比较。另外一个方法compare:options:, 它能给我们更多的选择权。 -
(NSComparisonResult)compare:(NSString * )aString options:(NSStringCompareOptions)mask;
options参数是一个掩位码。你可以使用位或bitwise-OR运算符(|)来添加选项标记。
1.6 字符串内是否包含别的字符串
1.6.1 判断字符串是否以另一个字符串开头,判断字符串是否以另一个字符串结尾。 - (BOOL)hasPrefix:(NSString *)aString;
-
(BOOL)hasSuffix:(NSString *)aString;
1.6.2 如果你想知道字符串内的某处是否包含其他字符串,请使用rangeOfString:。
将rangeOfString: 发送给一个NSString对象时,传递的参数是要查找的字符串。它会返回一个NSRange结构体,告诉你与这个字符串相匹配的部分在哪里以及能够匹配上的字符个数。如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。
1.7 可变性
NSString是不可变(immutable)的,这并不意味着你不能操作它们。不可变的意思是NSString一旦被创建,便不能改变。你可以对它执行各种各样的操作,例如用它来生成新的字符串、查找字符或者将它与其他字符串进行比较,但是你不能以删除字符或者添加字符的方式来改变它。
Cocoa提供了一个NSString的子类,叫做NSMutableString,如果你想改变字符串,请使用这个子类。这种区别类似于Java语言,NSString类似于Java中的String , 而NSMutableString则与Java中的StringBuffer一样。
1.7.1 你可以使用类方法stringWithCapacity:来创建一个新的NSMutableString,声明如下:
- (id) stringWithCapacity: (NSUInteger)capacity;
这个容量只是给NSMutableString一个建议,可以超过其大小。字符串的大小并不仅限于所提供的容量,这个容量仅是个最优值。(NSMutableString可以预分配一块内存来存储新创建的值,这样后续操作的速度就会快很多。)
1.7.2 拼接字符串
常见通过如下两个方法来附加新字符串:
- (void)appendString:(NSString *)aString;
-
(void)appendFormat:(NSString *)format,...;
appendString:接收参数aString, 然后将其复制到接受对象的末尾。appendFormat:的工作方式与stringWithFormat:类似,但并没有创建新的字符串,而是将格式化的字符串附加在了接受字符串的末尾。
1.7.3 删除指定位置特定长度的字符串
你可以使用deleteCharactersInRange:方法删除字符串的字符。
deleteCharactersInRange和rangeOfString:经常连在一起使用。
NSMutableString是NSString的子类。凭借面向对象编程的优势,你也可以在NSMutableString中使用NSString的所有功能,包括rangeOfString:方法、字符串比较方法等。
在实现description方法时,使用可变字符串是非常方便的。你可以通过appendString和appendFormat方法为对象创建一个详尽的描述。
由于NSMutableString是NSString的子类,所以我们“无偿”获得了连个特性。第一个就是任何使用NSString的地方,都可以用NSMutableString来替代。任何NSString可行的场合NSMutableString也能畅通无阻。第二个特性源于继承,与实例方法一样,继承对类方法也同样适用。
一、NSString有关的API的扩充学习:
1.创建和初始化字符串
2.拼接字符串
3.字符串大小写
3.1字符串小写
3.2字符串大写
4.分割字符串
注意:上述方法,如果接收分割消息的字符串对象中没有包含所传参数指定的字符串,则该方法会返回一个数组,数组中的元素是原字符串对象(receiver)。
注意:
即:第一个方法分割后获得的字符串包含所传参数指定下标的字符,而第二个方法分割后获得的字符串不包含所传参数指定下标的字符。
5.查询字符串
6.替换字符串
7.计算字符串所绘制文本矩形区域的frame
8.从字符串中得到相应数值
9.用来打开指定路径的文件,读取文件内容,并使用文件内容初始化一个字符串
注意:encoding参数将文件内容的类型告诉API。一般来说,你应该使用NSUTF8StringEncoding,它表示文件内容是用UTF8格式进行编码的。最后一个参数会在初始化没有发生错误时返回nil值。如果出现了错误,你可以使用localizedDescription方法来查明情况。
二、NSMutableString有关的API的学习
1.创建和初始化一个可变字符串
2.修改可变字符串