@property (nonatomic, strong) NSString *str;
#define address(obj) NSLog(@"%p", obj);
#define value(obj) NSLog(@"%@", obj);
NSMutableString *a = [NSMutableString stringWithFormat: @"a"];
address(a)
value(a)
self.str = a;
address(self.str)
value(self.str)
[a setString: @"b"];
address(a)
value(a)
address(self.str)
value(self.str)
输出
2018-09-29 09:26:51.018373+0800 test[91062:2018209] 0x60400005b360
2018-09-29 09:26:51.020217+0800 test[91062:2018209] a
2018-09-29 09:26:51.021226+0800 test[91062:2018209] 0x60400005b360
2018-09-29 09:26:51.021406+0800 test[91062:2018209] a
2018-09-29 09:26:51.025936+0800 test[91062:2018209] 0x60400005b360
2018-09-29 09:26:51.026168+0800 test[91062:2018209] b
2018-09-29 09:26:51.026379+0800 test[91062:2018209] 0x60400005b360
2018-09-29 09:26:51.026491+0800 test[91062:2018209] b
result:
strong修饰强拥有,内存一直没有改变,但是赋值的可变字符串a的值发生来改变会影响到str
@property (nonatomic, copy) NSString *str;
输出
2018-09-29 09:34:54.342395+0800 test[91141:2029573] 0x60400004a1d0
2018-09-29 09:34:54.342760+0800 test[91141:2029573] a
2018-09-29 09:34:54.343057+0800 test[91141:2029573] 0xa000000000000611
2018-09-29 09:34:54.343323+0800 test[91141:2029573] a
2018-09-29 09:34:54.344926+0800 test[91141:2029573] 0x60400004a1d0
2018-09-29 09:34:54.345984+0800 test[91141:2029573] b
2018-09-29 09:34:54.346662+0800 test[91141:2029573] 0xa000000000000611
2018-09-29 09:34:54.347832+0800 test[91141:2029573] a
result:
copy修饰的情况下, 如果赋值的字符串是个不可变的字符串, 不会有问题,如果是可变字符串,就会对可变字符串进行一次,深拷贝, 在赋值给str,所以a的操作在str被赋值之后,不会影响str
NSString 用copy还是strong可以根据实际需求进行选择。
网友评论