【NSMutableString概述 Objective-C语言】

一、字符串的恒定性

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对象中的字符串数据,不会新创建对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值