为何NSString要用Copy修饰不用Strong修饰

因为NSString是不可变的数据类型,它有对应的可变数据类型NSMutableString。用string修饰会有NSString被修改的可能,所以有对应可变数据类型的不可变数据类型都应该修饰为copy,copy表示该属性不能被修改。

PS:如果对可变数据类型如NSMutableString用copy来修饰,那么当对其进行修改时,程序会崩溃。


NSMutableArray和NSMutableString不能用copy修饰

验证:

首先定义两个属性:

@property (copy,nonatomic) NSString *copString;
@property (strong,nonatomic) NSString *strongString;

进行验证

    NSMutableString *aString = [[NSMutableString alloc]initWithString:@"aaa"];
    NSMutableString *bString = [[NSMutableString alloc]initWithString:@"bbb"];
    
    self.copString = aString;
    self.strongString = bString;
    
    NSLog(@"aString的地址:%p,bString的地址:%p",aString,bString);
    NSLog(@"copyString的值:%@,strongString的值:%@",self.copString,self.strongString);
    NSLog(@"copyString的地址:%p,strongString的地址:%p",self.copString,self.strongString);
    
    [aString appendString:@"aaa"];
    [bString appendString:@"bbb"];
    
    NSLog(@"aString的地址:%p,bString的地址:%p",aString,bString);
    NSLog(@"copyString的值:%@,strongString的值:%@",self.copString,self.strongString);
    NSLog(@"copyString的地址:%p,strongString的地址:%p",self.copString,self.strongString);

控制台输出

2019-01-18 16:38:00.241352+0800 bing[15277:1294306] aString的地址:0x6000031ee850,bString的地址:0x6000031ee070
2019-01-18 16:38:00.241455+0800 bing[15277:1294306] copyString的值:aaa,strongString的值:bbb
2019-01-18 16:38:00.241532+0800 bing[15277:1294306] copyString的地址:0x88df3104acfd2c12,strongString的地址:0x6000031ee070
2019-01-18 16:38:00.241606+0800 bing[15277:1294306] aString的地址:0x6000031ee850,bString的地址:0x6000031ee070
2019-01-18 16:38:00.241680+0800 bing[15277:1294306] copyString的值:aaa,strongString的值:bbbbbb
2019-01-18 16:38:00.241759+0800 bing[15277:1294306] copyString的地址:0x88df3104acfd2c12,strongString的地址:0x6000031ee070

结论:

copy修饰的字符串的值,在NSMutableString的值改变后没变,而strong修饰的字符串的值发生了改变,两者的内存地址都没有发生变化。

并没有发现经常听说的有关深复制,浅复制的问题,不知为何,如有问题,希望指出,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容