若是肯定要给属性NSString赋一个不可变的值时,用strong,其余状况用copy。使用copy来修饰属性,在进行赋值的时候,会先作一个类型判断,若是赋的值是一个不可变的字符串,则走strong的策略,进行的是浅拷贝;若是是可变的字符串,则进行深拷贝建立一个新的对象。因此若是咱们肯定是给属性赋值一个不可变的值,就不用copy再多去判断一遍类型。测试代码以下:bash
@property(nonatomic, strong) NSString *str1;
@property(nonatomic, copy) NSString *str2;
NSString *data = @"test";
self.str1 = data;
self.str2 = data;
NSLog(@"strongStr = %p,copyStr = %p", self.str1, self.str2);
//打印的是同一个地址:
//strongStr = 0x10298f4f8,copyStr = 0x10298f4f8
NSMutableString *data = [[NSMutableString alloc] initWithString:@"test"];
self.str1 = data;
self.str2 = data;
NSLog(@"strongStr = %p,copyStr = %p", self.str1, self.str2);
//打印的不是同一个地址:
//strongStr = 0x6000003635d0,copyStr = 0xdec3a66540416ef2
复制代码
咱们常用对象接收网络数据,一般使用strong,由于不会改变。而如NSCache属性中的name字段,应该使用copy,否则打印出来的名字就有可能非预想值。网络