美文网首页
OC:修饰 NSString 用 copy 还是 strong?

OC:修饰 NSString 用 copy 还是 strong?

作者: 春暖花已开 | 来源:发表于2019-05-20 15:57 被阅读0次

先来看个例子:

#import "HomeViewController.h"

@interface HomeViewController ()

@property (nonatomic, copy) NSString *copiedStr;
@property (nonatomic, strong) NSString *strongStr;

@property (nonatomic, strong) NSMutableString *mutableStr;

@end

- (void)viewDidLoad {
    [super viewDidLoad];

    self.mutableStr = [[NSMutableString alloc] initWithString:@"hello"];
    self.copiedStr = self.mutableStr;
    self.strongStr = self.mutableStr;
    
    NSLog(@"copiedStr = %@ -- strongStr = %@ -- mutableStr = %@", self.copiedStr, self.strongStr, self.mutableStr);
}

- (IBAction)changeMutableValue:(id)sender {
    
    [self.mutableStr insertString:@"OK_" atIndex:0];
    NSLog(@"copiedStr = %@ -- strongStr = %@ -- mutableStr = %@", self.copiedStr, self.strongStr, self.mutableStr);
}

打印结果:

// viewDidLoad
copiedStr = hello -- strongStr = hello -- mutableStr = hello
// changeMutableValue
copiedStr = hello -- strongStr = OK_hello -- mutableStr = OK_hello

当上例中的 viewDidLoad 更换为下面的代码之后:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    __block NSString *tempStr = @"tempStr";
    self.copiedStr = tempStr;
    self.strongStr = tempStr;
    NSLog(@"copiedStr = %@ -- strongStr = %@ -- tempStr = %@", self.copiedStr, self.strongStr, tempStr);
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        tempStr = @"changed_tempStr";
        NSLog(@"copiedStr = %@ -- strongStr = %@ -- tempStr = %@", self.copiedStr, self.strongStr, tempStr);
    });
}

打印结果:

copiedStr = tempStr -- strongStr = tempStr -- tempStr = tempStr
// 2s 后打印
copiedStr = tempStr -- strongStr = tempStr -- tempStr = changed_tempStr
由此可见:

使用 copy 修饰的字符串,不会随着赋值变量可变字符串 mutableStr 的改变而改变;而使用 strong 修饰的字符串,则会随着赋值变量可变字符串 mutableStr 的改变而改变。对于赋值变量为非可变字符串的时候,用 copy 还是 strong 其实都是一样的。


结论:
  • 确定要给 NSString 属性赋一个不可变的值时,用 strong 修饰。如果使用 copy 来修饰,在进行赋值的时候,会先做一个类型判断:如果赋的值是一个不可变的字符串,则走 strong 的策略,进行的是浅拷贝;如果是可变的字符串,则进行深拷贝创建一个新的对象。如果是很多的NSString属性需要赋一个不可变的值,会极大的增加系统开销。所以用 strong 在此情况下可以提升性能。

  • 使用copy来修饰,这样保证了安全性。因为如果赋值的可变的字符串,当它发生变化时,用 strong 修饰的属性的值也会跟着变化;而 copy 修饰的属性,则因为是深拷贝而不会变化。


参考:
NSString使用copy还是strong
iOS小知识(三):NSString用copy还是strong修饰?

相关文章

网友评论

      本文标题:OC:修饰 NSString 用 copy 还是 strong?

      本文链接:https://www.haomeiwen.com/subject/bwikzqtx.html