返回信息流我在appdelegate.h里定义了两个copy修饰的变量:
@property(nonatomic, copy)NSString *string1;
@property(nonatomic, copy)NSString *string2;
然后再appdelegate.m里给他们赋了相同的值:
string1 = @"string";
string2 = @"string";
我觉得string1和string2这两个指针会指向不同的内存,内存里放的都是"string",但是打印地址之后却指向了同一块的内存,为什么会这样,是我对copy理解错了吗?
这是一条镜像帖。来源:北邮人论坛 / mobile-terminal-at / #18027同步于 2014/11/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
MobileTerminalAT机器人发帖
碰到IOS基础问题
payne14
2014/11/25镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
mark,学习
【 在 payne14 (长门_) 的大作中提到: 】
: 我在appdelegate.h里定义了两个copy修饰的变量:
: @property(nonatomic, copy)NSString *string1;
: @property(nonatomic, copy)NSString *string2;
: ...................
提示一下 你把2个 property 的nsstring 换成 nsmutablestring试试
记得不要用 self.string1 = @"xx" 赋值 这样无论你定义的是什么类型 @“”都是nsstring
嗯,我知道nsmutablestring的mutableCopy方法可以拷贝到不同内存。。那用copy修饰的nsstring的怎么理解啊
【 在 apocalypse 的大作中提到: 】
: 提示一下 你把2个 property 的nsstring 换成 nsmutablestring试试
: 记得不要用 self.string1 = @"xx" 赋值 这样无论你定义的是什么类型 @“”都是nsstring
【 在 payne14 的大作中提到: 】
: 嗯,我知道nsmutablestring的mutableCopy方法可以拷贝到不同内存。。那用copy修饰的nsstring的怎么理解啊
其实 对于 nsstring 底层 根本不进行copy 直接和strong 是一模一样的。。。
原因是 nsstring 是只读的。。。nsstring 一旦创建出来就不可修改。。
nsstring的赋值过程 是 完全创建一个新的 nsstring 然后直接替换
nsmutablestring的赋值过程是 在原对象上属性进行修改。。。
后者对copy是有需求的。。copy出一份 以免内存上的公用造成修改一处 影响其他处。。(深浅拷贝)
但是nsstring 根本就是只读。。。他没有这个问题。。。没啥要copy的场景。。你copy出2个 不能修改的nsstring 没啥意义
于是底层 对nsstring 的copy处理 其实就是和retain 一模一样
嗯,懂了,非常感谢
【 在 apocalypse 的大作中提到: 】
:
: 其实 对于 nsstring 底层 根本不进行copy 直接和strong 是一模一样的。。。
: 原因是 nsstring 是只读的。。。nsstring 一旦创建出来就不可修改。。
: ...................
【 在 apocalypse 的大作中提到: 】
:
: 其实 对于 nsstring 底层 根本不进行copy 直接和strong 是一模一样的。。。
: 原因是 nsstring 是只读的。。。nsstring 一旦创建出来就不可修改。。
: ...................
昨天看到这个帖子,想起书中说nsstring属性最好设成copy,于是自己就试了下,发现如果对@(copy)NSString *name;这样的属性赋值,如果赋值对象是一个NSString的可变子类(NSMutableString),是会拷贝一份再赋值的,这也是为啥要设成copy的原因,因为它有可变子类。
代码
CopyTest *test = [[CopyTest alloc]init];
CopyTest *test1 = [[CopyTest alloc]init];
test.name = @"jack";
test1.name = @"jack";
NSLog(@"test.name address is %p",test.name);
NSLog(@"test.name address is %p",test1.name);
NSString *name = [NSMutableString stringWithFormat:@"%@",@"toulaoshi"];
test.name = name;
test1.name = name;
NSLog(@"test.name address is %p",test.name);
NSLog(@"test.name address is %p",test1.name);
结果
2015-03-07 12:58:48.524 bdmaptest[1045:251273] test.name address is 0x1423a4
2015-03-07 12:58:48.526 bdmaptest[1045:251273] test.name address is 0x1423a4
2015-03-07 12:58:48.526 bdmaptest[1045:251273] test.name address is 0x175c3a30
2015-03-07 12:58:48.527 bdmaptest[1045:251273] test.name address is 0x175ba7b0
求问什么书
【 在 toulaoshi 的大作中提到: 】
: 昨天看到这个帖子,想起书中说nsstring属性最好设成copy,于是自己就试了下,发现如果对@(copy)NSString *name;这样的属性赋值,如果赋值对象是一个NSString的可变子类(NSMutableString),是会拷贝一份再赋值的,这也是为啥要设成copy的原因,因为它有可变子类。
: 代码
: CopyTest *test = [[CopyTest alloc]init];
: ...................