美文网首页
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