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相对安全一点

上一篇下一篇

猜你喜欢

热点阅读