项目中经常会遇到字符串的处理工作,从我个人习惯来说,我比较倾向于使用NSString
。但是既然系统提供了NSMutableString
,就一定会有他的优势的。
别人的博客针对这两个类进行了比较详细的比较,接下来,以我认为便于记忆的方式将这两个类的使用场景做个总结。
- 如果对字符串进行频繁的修改,要使用
NSMutableString
。 - 如果对字符串进行偶尔的修改,要使用
NSString
。
注意,在使用NSMutableString
作为属性的时候,该使用copy
还是strong
呢?
首先,看下测试用例:
- (void)testEx
{
NSString *string = [NSString stringWithFormat:@"abc"];
NSMutableString *mString = [NSMutableString stringWithString:string];
NSLog(@"todo --- %@ -- %@", [string class], [mString class]);
NSLog(@"todo --- %@ -- %@", [[string copy] class], [[mString copy] class]);
NSLog(@"todo --- %@ -- %@", [[string mutableCopy] class], [[mString mutableCopy] class]);
// 打印日志:
/*
2018-08-22 15:56:04.936770+0800 CouponPurchase[27023:3516880] todo --- NSTaggedPointerString -- __NSCFString
2018-08-22 15:56:04.936943+0800 CouponPurchase[27023:3516880] todo --- NSTaggedPointerString -- NSTaggedPointerString
2018-08-22 15:56:04.937210+0800 CouponPurchase[27023:3516880] todo --- __NSCFString -- __NSCFString
*/
}
可以看到,不管NSString
还是NSMutableString
类型,经过copy
之后都是NSTaggedPointerString
类型。所以当NSMutableString
作为属性时,应该使用strong
,才能保证属性的类型不会发生变化。
测试用例如下:
@property (nonatomic, strong) NSMutableString *sstring;
@property (nonatomic, copy) NSMutableString *cstring;
- (void)testnx
{
NSString *string = [NSString stringWithFormat:@"abc"];
self.sstring = [NSMutableString stringWithString:string];
self.cstring = [NSMutableString stringWithString:string];
// [_sstring deleteCharactersInRange:NSMakeRange(0, 1)];
// [_cstring deleteCharactersInRange:NSMakeRange(0, 1)];
NSLog(@"todo --- %@ -- %@", [_sstring class], [_cstring class]);
self.sstring = [NSMutableString stringWithString:string];
self.cstring = [NSMutableString stringWithString:string];
NSLog(@"todo --- %@ -- %@", [_sstring class], [_cstring class]);
// 打印日志:
/*
2018-08-22 16:14:52.757416+0800 CouponPurchase[30735:3572671] todo --- __NSCFString -- NSTaggedPointerString
2018-08-22 16:14:52.757698+0800 CouponPurchase[30735:3572671] todo --- __NSCFString -- NSTaggedPointerString
*/
}
可以看到使用copy
修饰,实例变量的类型确实会发生变化。
- 当使用
NSMutableString
作为实例变量时,务必使用strong
修饰。