Property-NSString-Copy
- 我们先定义一个测试类
BMPerson
@interface BMPerson : NSObject
@property (strong, nonatomic) NSString *strStrong; ///< strStrong
@property (copy, nonatomic) NSString *strCopy; ///< strCopy
@property (strong, nonatomic) NSObject *obj; ///< obj
@end
@implementation BMPerson
- (void)logFunc {
NSLog(@"_strStrong的内容: %@ _strStrong 存放的地址:%p _strStrong 的地址:%p", _strStrong, _strStrong, &_strStrong);
NSLog(@"_strCopy的内容: %@ _strCopy 存放的地址:%p _strCopy 的地址:%p", _strCopy, _strCopy, &_strCopy);
}
@end
- 在
main
函数中执行如下代码:
NSString *str = @"abc";
BMPerson *per = [BMPerson new];
per.strStrong = str;
per.strCopy = str;
NSLog(@"str修改前: str的内容: %@ str 存放的地址:%p str 的地址:%p", str, str, &str);
[per logFunc];
NSLog(@"\n");
str = @"qwe";
NSLog(@"str修改后: str的内容: %@ str 存放的地址:%p str 的地址:%p", str, str, &str);
[per logFunc];
会输出如下的log
035304+0800 Demo[58039:7367327] str修改前: str的内容: abc str 存放的地址:0x100002098 str 的地址:0x7fff5fbff748
035455+0800 Demo[58039:7367327] _strStrong的内容: abc _strStrong 存放的地址:0x100002098 _strStrong 的地址:0x100200198
035483+0800 Demo[58039:7367327] _strCopy的内容: abc _strCopy 存放的地址:0x100002098 _strCopy 的地址:0x1002001a0
035503+0800 Demo[58039:7367327]
035513+0800 Demo[58039:7367327] str修改后: str的内容: qwe str 存放的地址:0x1000020f8 str 的地址:0x7fff5fbff748
035522+0800 Demo[58039:7367327] _strStrong的内容: abc _strStrong 存放的地址:0x100002098 _strStrong 的地址:0x100200198
035543+0800 Demo[58039:7367327] _strCopy的内容: abc _strCopy 存放的地址:0x100002098 _strCopy 的地址:0x1002001a0
- 似乎是
strong
和copy
没有任何区别,那么我们换一种方式看看。
NSMutableString *str = [NSMutableString stringWithFormat:@"abc"];
BMPerson *per = [BMPerson new];
per.strStrong = str;
per.strCopy = str;
NSLog(@"str修改前: str的内容: %@ str 存放的地址:%p str 的地址:%p", str, str, &str);
[per logFunc];
NSLog(@"\n");
[str appendString:@"+a"];
NSLog(@"str修改后: str的内容: %@ str 存放的地址:%p str 的地址:%p", str, str, &str);
[per logFunc];
会输出如下的log
035625+0800 Demo[58039:7367327] str修改前: str的内容: abc str 存放的地址:0x100200a80 str 的地址:0x7fff5fbff738
035735+0800 Demo[58039:7367327] _strStrong的内容: abc _strStrong 存放的地址:0x100200a80 _strStrong 的地址:0x100200198
035755+0800 Demo[58039:7367327] _strCopy的内容: abc _strCopy 存放的地址:0x63626135 _strCopy 的地址:0x1002001a0
035760+0800 Demo[58039:7367327]
035770+0800 Demo[58039:7367327] str修改后: str的内容: abc+a str 存放的地址:0x100200a80 str 的地址:0x7fff5fbff738
035778+0800 Demo[58039:7367327] _strStrong的内容: abc+a _strStrong 存放的地址:0x100200a80 _strStrong 的地址:0x100200198
035794+0800 Demo[58039:7367327] _strCopy的内容: abc _strCopy 存放的地址:0x63626135 _strCopy 的地址:0x1002001a0
-
第一种方式
-
第二种方式
-
由上面的图我相信可以清楚发现问题的所在了,使用我们声明
NSSring
声明的属性时尽量使用copy
吧。