2018-04-19 NSString 用copy修饰为什么?

2018-04-19  本文已影响13人  龙之天下

当时问道这个问题彻底的蒙圈了,............, A lot of ellipsis on behalf of my mood (好多省略号代表我的心情)

接下来想做一些验证:
首先创建两个属性如下:

@property (nonatomic,copy) NSString * ntvCopyName;
@property (nonatomic, strong) NSString *strong_name;

提出自己的疑问?
//NSString 被copy修饰的ntvCopyName和被strong修饰的strong_name 地址会不会变化呢?

    NSString * originString = @"To say To young people";
    NSLog(@"originString:%@",originString);
    NSLog(@"originString:%@--内存地址:%p",originString,originString);
    self.ntvCopyName = originString;
    self.strong_name = originString;

    NSLog(@"self.copy_name :%@--内存地址:%p",  self.ntvCopyName,self.ntvCopyName);
    NSLog(@"self.strong_name:%@--内存地址:%p",    self.strong_name,self.strong_name);

    /*
      用NSString类型验证的打印结果:
     self.ntvCopyName和
     self.strong_name的地址与originString地址一样
     目前打印的值是一样
      无论被copy修饰还是被strong的字符串的对象的 地址和值没有受影响
     */
    
    //      NSMutableString  被copy修饰的ntvCopyName和被strong修饰的strong_name 地址会不会变化呢?
    NSMutableString *mutableString = [NSMutableString stringWithString:originString];
    self.ntvCopyName = mutableString;
    self.strong_name = mutableString;
    NSLog(@"mutableString:%@--内存地址:%p",mutableString,mutableString);
    NSLog(@"self.copy_name :%@--内存地址:%p",  self.ntvCopyName,self.ntvCopyName);
    NSLog(@"self.strong_name:%@--内存地址:%p",    self.strong_name,self.strong_name);
    /*
       用NSMutableString类型验证的打印结果:
         self.strong_name的地址还是与mutableString地址一样
         self.ntvCopyName的地址发生变化了,并不与mutableString地址一样,它新开辟一块地址
         目前打印的值是一样,指针指向并不是同一块地址
     */
    // 给mutableString额外的添加字符串
    [mutableString appendString:@"We should study deeply"];
    NSLog(@"给mutableString额外的添加字符串:mutableString:%@--内存地址:%p",mutableString,mutableString);
    NSLog(@"给mutableString额外的添加字符串:self.copy_name :%@--内存地址:%p",  self.ntvCopyName,self.ntvCopyName );
    NSLog(@"给mutableString额外的添加字符串:self.strong_name:%@--内存地址:%p",    self.strong_name,self.strong_name);
    
    /*
         1.将NSMutableString 类型的对象赋值给被copy所修饰的NSString的对象,NSString的对象的地址会发生变化,并不和NSMutableString 类型的对象的地址一样
         2.将NSMutableString 类型的对象赋值给被strong所修饰的NSString的对象,NSString的对象的地址会发生变化,和NSMutableString 类型的对象的地址一样
        3.NSMutableString类型对象的值发生变化,则被copy所修饰的NSString的对象的值并不发生变化而被strong所修饰的NSString的对象的值随之变化(和NSMutableString类型对象的值一样)
     */

个人建议:
NSString 类型用copy所修饰,NSMutableString类型可以用strong来修饰。
以上个人观点,希望可以互相交流。

上一篇下一篇

猜你喜欢

热点阅读