iOS中修饰关键字的一些研究
2019-03-15 本文已影响0人
流年划过颜夕
最近花时间又深入研究了下公司项目,发现项目中对NSString的修饰都用的strong,其实NSString使用strong还是copy修饰,对于当前项目业务逻辑都没任何影响。
但是以后开发还是需要注意细节优化,就是用关键字strong带来数据安全性的潜在问题。
举个例子:
@interface User : EHModel
// 姓名
@property (strong, nonatomic) NSString * name;
@end
#import "User.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
NSMutableString *string = [NSMutableString stringWithFormat:@"Hello"];
User *user1 = [[User alloc] init];
user1.name =string;
[string appendString:@" world"];
NSLog(@"%@", user1.name);
}
}
打印结果为:Hello world
@interface User : EHModel
// 姓名
@property (copy, nonatomic) NSString * name;
@end
#import "User.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
NSMutableString *string = [NSMutableString stringWithFormat:@"Hello"];
User *user1 = [[User alloc] init];
user1.name =string;
[string appendString:@" world"];
NSLog(@"%@", user1.name);
}
}
打印结果为:Hello
可见当遇见可变字符串赋值时,strong修饰的NSString会跟随string变化而变化,而copy修饰的NSString则不会变化。
分析底层产生的原因是:
user1.name = string
实际是调用了set方法进行赋值,等价于:
[user1 setName:string];
再进行深入分析,用strong修饰的NSString等价于:
//还是同一对象赋值
-(void)setName:(NSString *)name
{
_name = name;
}
用copy修饰的NSString等价于:
//copy出了一个新的对象进行赋值
-(void)setName:(NSString *)name
{
_name = [name copy];
}
所以用stong修饰的潜在问题就是:
曾经赋值的对象如果修改了,会导致自身也发生变化。
用了copy则互不影响。
参考苹果官方的设计也是统一默认用copy来修饰NSString,主要也是为了数据的安全性。
最后总结下,如果业务逻辑没有特殊要求下,以后最好还是按照官方的设计模式用copy来修饰NSString相对安全一点