美文网首页
iOS中修饰关键字的一些研究

iOS中修饰关键字的一些研究

作者: 流年划过颜夕 | 来源:发表于2019-03-15 11:45 被阅读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相对安全一点

    相关文章

      网友评论

          本文标题:iOS中修饰关键字的一些研究

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