NSString与NSMutableString的使用场景

项目中经常会遇到字符串的处理工作,从我个人习惯来说,我比较倾向于使用NSString。但是既然系统提供了NSMutableString,就一定会有他的优势的。

别人的博客针对这两个类进行了比较详细的比较,接下来,以我认为便于记忆的方式将这两个类的使用场景做个总结。

  1. 如果对字符串进行频繁的修改,要使用NSMutableString
  2. 如果对字符串进行偶尔的修改,要使用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修饰。

猜你喜欢

转载自blog.csdn.net/jianghui12138/article/details/81941345