《Objective-C基础教程》读书笔记5.1—字符串

1 字符串
NSString, Cocoa中用来处理字符串的类。字符串其实就是一组人类刻度的字符序列。由于计算机与人类进行定期交互,因此最好让它们有一个可以存储和处理人类可读文本的方式。NSString型数据,特殊的NSString字面量,其标志为双引号内字符串前面的@符号。与OC不同,C语言将字符串作为简单的字符数组进行处理,并且在数组最后添加尾部的零字节作为结束标志。
1.1 创建字符串
NSString的StringWithFormat:方法是通过接受格式字符串和参数来创建NSString的。
+(id)stringWithFormat: (NSString *)format, ......;


9301275F-3E26-4046-BCE5-3DA180B13A16.png

91CEECFF-9934-464D-A166-07101F5BDF14.png

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,它返回的是字符串中的字符串个数。


1528620192112.jpg

1528619931013.jpg

NSString的length方法能够精确无误地处理各种语言的字符串,如含有俄文、中文或者日文字符的字符串,以及使用Unicode国际字符标准的字符串。
1.4 字符串比较
isEqualToString:可以用来比较接收方(receiver, 接收消息的对象)和作为参数传递过来的字符串。isEqualToString: 返回一个BOOL值(YES或NO)来表示两个字符串的内容是否相同。它的声明如下。
  • (BOOL)isEqualToString:(NSString *)aString;
    使用方式如下:


    1528622791370.jpg

    1528622835751.jpg

    要比较两个字符串,可以使用compare:方法, 其声明如下:

  • (NSComparisonResult)compare:(NSString *)aString;
    compare:将接收对象和传递过来的字符串逐个进行比较,它返回一个NSComparisonResult(也是一个enum型枚举)来显示比较结果,有升序(NSOrderedAscending)、相等(NSOrderedSame)和降序(NSOrderedDescending)三种情况。类似于C语言中的函数qsort()或bsearch(), 这个方法主要用来排序。如果compare: 返回的结果是NSOrderedAscending,那么左侧的数值就小于右侧的数值,即比较的目标在字符表中的排序位置比传递进来的字符串更靠前。
    注意点:正确比较字符串
    比较两个字符串是否相等时,应该使用isEqualToString: ,而不能仅仅比较字符串的指针值,举个例子:


    1528624069152.jpg

    两种比较方式不同。这是因为==运算符只判断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运算符(|)来添加选项标记。


    1528635491146.jpg

    1528635548171.jpg

    1.6 字符串内是否包含别的字符串
    1.6.1 判断字符串是否以另一个字符串开头,判断字符串是否以另一个字符串结尾。

  • (BOOL)hasPrefix:(NSString *)aString;
  • (BOOL)hasSuffix:(NSString *)aString;
    1.6.2 如果你想知道字符串内的某处是否包含其他字符串,请使用rangeOfString:。
    将rangeOfString: 发送给一个NSString对象时,传递的参数是要查找的字符串。它会返回一个NSRange结构体,告诉你与这个字符串相匹配的部分在哪里以及能够匹配上的字符个数。如果传递的参数在接收字符串中没有找到,那么range.location则等于NSNotFound。


    1528638086479.jpg

    1528638121466.jpg

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:方法、字符串比较方法等。


    1528640968832.jpg

    1528641001779.jpg

    在实现description方法时,使用可变字符串是非常方便的。你可以通过appendString和appendFormat方法为对象创建一个详尽的描述。
    由于NSMutableString是NSString的子类,所以我们“无偿”获得了连个特性。第一个就是任何使用NSString的地方,都可以用NSMutableString来替代。任何NSString可行的场合NSMutableString也能畅通无阻。第二个特性源于继承,与实例方法一样,继承对类方法也同样适用。
    一、NSString有关的API的扩充学习:
    1.创建和初始化字符串


    1532324146584.jpg
1532324192404.jpg
1532324212226.jpg
1532324278207.jpg
1532324324596.jpg

2.拼接字符串


1532325372694.jpg

3.字符串大小写
3.1字符串小写


1532325738415.jpg

3.2字符串大写
1532325781642.jpg

4.分割字符串
1532327357346.jpg

1532337813843.jpg

1532337667487.jpg

注意:上述方法,如果接收分割消息的字符串对象中没有包含所传参数指定的字符串,则该方法会返回一个数组,数组中的元素是原字符串对象(receiver)。


1532327549661.jpg

注意:
1532333918370.jpg

1532333958516.jpg

即:第一个方法分割后获得的字符串包含所传参数指定下标的字符,而第二个方法分割后获得的字符串不包含所传参数指定下标的字符。
5.查询字符串
1532327827398.jpg

1532327898870.jpg

6.替换字符串
1532329542719.jpg

1532329583048.jpg

7.计算字符串所绘制文本矩形区域的frame
1532330018132.jpg

8.从字符串中得到相应数值
1532330167998.jpg

9.用来打开指定路径的文件,读取文件内容,并使用文件内容初始化一个字符串


1539701906812.jpg

注意:encoding参数将文件内容的类型告诉API。一般来说,你应该使用NSUTF8StringEncoding,它表示文件内容是用UTF8格式进行编码的。最后一个参数会在初始化没有发生错误时返回nil值。如果出现了错误,你可以使用localizedDescription方法来查明情况。
二、NSMutableString有关的API的学习
1.创建和初始化一个可变字符串
1532403790902.jpg

2.修改可变字符串
1532403983541.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容