一、字符串的恒定性 1.一旦创建一个字符串对象,那么这个字符串对象的内容就无法更改了 , 当我们修改字符串的时候,其实是重新的创建了1个字符串对象 例如,我这儿有一个字符串,NSString *str = @“” for(int i=0;i<50000;i++) { str = [NSString stringWithFormat:@“%@%d”,str,i]; } 我想请问大家一个问题,这段代码执行完了以后,内存当中将会有多少个字符串对象 50000+1个吧 一开始,这儿有一个字符串对象 NSString *str = @“”; 当我循环完第一次之后 这段代码什么意思 [str stringWithFormat:@“%@%d”,str,i]; 这段代码什么意思,是不是连接一个字符串啊 先把这个str放上去啊,再把i的值放上去,就是0,所以一开始的时候,第一次循环,生成一个字符串"0"这个字符串 把"0"这个字符串是不是重新赋给str,那这个时候,重新赋值给str,是不是改了str的值啊 这个是修改它吗,还是重新创建了1个字符串对象啊,重新创建1个 好了,第二次循环,又创建了一个字符串对象,叫做"01",又把"01"赋值给str,是不是又创建对象啊,所以每次循环的时候,都有一个字符串对象产生,所以我们这段代码执行完了以后,内存当中会产生50001个字符串对象 那么大家思考一下,创建50000个对象,你觉得会很快吗 好,我们试一下,在最开始打印个横线吧,在最后面再打印一个横线吧 NSLog(@“------------”); NSString *str = @“”; for(int i=0;i<50000;i++) { str = [NSString stringWithFormat:@“%@%d”,str,i]; } NSLog(@“------------”); 看看需要多长时间 输出: 2022-10-23 21:51:23.322138+0800 [15170:60981] ---------------------- 2022-10-23 21:51:27.705237+0800 Day[15170:60981] ------------------------ 耗时4秒 为什么会这么久,因为这个循环每次循环都会创建1个字符串对象,因为这个字符串的恒定性,所以会有50001个字符串对象产生 我们创建对象本身就是很浪费时间的,我们说过,创建对象怎么创建对象的啊,先申请空间,再创建对象,再初始化对象的属性,再返回地址吧,创建1个对象就要四个步骤,更不用说你连续来50000个 2.我们后面的工作中,会不会有这种可能,50000次可能有点儿多,但是几千次,我们做字符串拼接,是不是一定有这种可能啊,比如说来10000次,一下给我走5、6秒钟,你能接受吗,肯定接受不了啊,所以这个时候,我就想啊,能不能快一点儿啊 如何让这样大批量的字符串拼接可以更加快速一点儿 1)慢的原因:因为字符串的恒定性,每次修改字符串的时候,是重新的创建一个对象,而创建对象是很浪费时间的,更不用说你创建50000个 2)希望:有没有一种对象是用来存储字符串的,并且存储在这个对象中的字符串数据,可以更改 如果有这种对象,我们做大批量拼接,对象只会有几个,1个 我每次改的时候,都是改的这个对象里面的字符串吧 就不需要再去创建很多对象了 3.有没有这样的对象呢,肯定是有的,没有就不废这么多话了 它是谁,是NSMutableString 1)NSMutableString,它是Foundation框架中的一个类,从NSString继承 这个类的定义如下: @interface NSMutableString : NSString - (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString; @end 所以,NSMutableString是用来存储字符串数据的 所以,NSString有的功能,NSMutableString有没有,有 2)NSMutableString在父类NSString的基础之上做的扩展,这个要牢记啊 存储在NSMutableString对象中的字符串数据可以更改,具有可变性 直接可以改存储在NSMutableString对象中的字符串数据,不会新创建对象