先来看个例子:
#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修饰?
网友评论