如果确定要给属性NSString赋一个不可变的值时,用strong,其他情况用copy。使用copy来修饰属性,在进行赋值的时候,会先做一个类型判断,如果赋的值是一个不可变的字符串,则走strong的策略,进行的是浅拷贝;如果是可变的字符串,则进行深拷贝创建一个新的对象。所以如果我们确定是给属性赋值一个不可变的值,就不用copy再多去判断一遍类型。测试代码如下:
@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 = 0x10298f4f8NSMutableString *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,不然打印出来的名字就有可能非预想值。