• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSMutableString 保留/复制是一样的(复制不起作用?)

[复制链接]
菜鸟教程小白 发表于 2022-12-13 09:09:40 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在没有 ARC 的 XCode 6.4 下测试 copy/retain 属性。

@property(nonatomic, retain) NSMutableString *retainString;
@property(nonatomic, copy) NSMutableString *copyedString;
@synthesize copyedString, retainString;



    NSMutableString *mStr = [NSMutableString stringWithFormat"abc"];
    retainString = mStr;
    copyedString = mStr;
    NSLog(@"mStr:%p",  mStr);
    NSLog(@"retainStr:%p", retainString);
    NSLog(@"copyStr:%p",   copyedString);

    [mStr appendString"de"];
    NSLog(@"retainStr:%@",  retainString);
    NSLog(@"copyStr:%@",    copyedString);

    [copyedString appendString"123"];
    NSLog(@"mStr:%@",  mStr);
    NSLog(@"copyStr:%@",    copyedString);
    NSLog(@"retainStr:%@",  retainString);

我的问题:

  1. copyedString 应该分配一个新空间,三个字符串的地址相同。
  2. mString 改变时,copyedString 不应该改变(我知道它们现在是同一个地址所以改变了)
  3. copyedString 已更改,mStrretainString 不应更改。

我是不是做错了什么?

这里是日志:

[10656:986440] mStr:0x7f871bd71340
[10656:986440] retainStr:0x7f871bd71340
[10656:986440] copyStr:0x7f871bd71340
[10656:986440] retainStr:abcde
[10656:986440] copyStr:abcde
[10656:986440] mStr:abcde123
[10656:986440] copyStr:abcde123
[10656:986440] retainStr:abcde123

编辑哦,是的,我的错。 self.property 将调用 setter 和 getter,这意味着使用了副本。

所以解决办法就是把这两行改成:

self.retainString = mStr;
self.copyedString = mStr;

但是我收到了这个崩溃错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
*** First throw call stack:

copyedString 会变成 NSString 吗?



Best Answer-推荐答案


如果你想设置值,你应该使用 self 来访问复制属性。

  NSMutableString *mStr = [NSMutableString stringWithFormat"abc"];

self.retainString = mStr;

self.copyedString = mStr;

NSLog(@"mStr:%p",  mStr);
NSLog(@"retainStr:%p", self.retainString);
NSLog(@"copyStr:%p",   self.copyedString);

[mStr appendString"de"];

NSLog(@"retainStr:%@",  self.retainString);
NSLog(@"copyStr:%@",    self.copyedString);

日志

2015-07-24 16:11:19.728 OCTest[13193:268356] mStr:0x7f84034ba020
2015-07-24 16:11:19.729 OCTest[13193:268356] retainStr:0x7f84034ba020
2015-07-24 16:11:19.729 OCTest[13193:268356] copyStr:0x7f84034bfa50
2015-07-24 16:11:19.729 OCTest[13193:268356] retainStr:abcde
2015-07-24 16:11:19.729 OCTest[13193:268356] copyStr:abc

以你的方式,它不是复制,它只是使用指针来访问地址。所以,它指向同一个地址

编辑

如果要复制属性返回可变结果,请删除@synthesize,然后重写

-(void)setCopyedStringNSMutableString *)copyedString{
    _copyedString = [copyedString mutableCopy];
}

关于ios - NSMutableString 保留/复制是一样的(复制不起作用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604982/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap