iOS copy 和 mutableCopy 学习
(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分
关于Copy 有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢” 或者说”为什么 NSString 类型成员变量的修饰属性用 copy 而不是 strong (或 retain ) ?”
明显 第一句比第二句 严谨多了.
@property (strong,nonatomic) NSString *strongString; & @property (copy,nonatomic) NSString *copyString;
正确理解 应该是区分这两种表达方式的区别
不同写法,权限 不同 安全级别不同.
(1)如果是 一个 普通NSString 赋值给copyString 和 strongString 没区别, copy 是浅拷贝, 对于二者的被赋值 都是指针引用
(2)如果是一个可变字符串NSMutableString 赋给copyString 和 strongString ,对于copyString则是深复制 不会跟着源头的变化而变化.而strongString 还是浅复制 是指针引用 会随着源头的变化而变化
其二,copy 和 mutableCopy
copy 是浅复制 , 简单指针引用,随源头的变化而变化
multableCopy 是深复制,是创建了一个新的对象,不会随着源头变化而变化
以下 是一位网友得到的 的Runtime源码中NSMutableString.m实例方法 -(id)copy { return [[NSString alloc] initWithString:self]; }
return [[NSString allocWithZone:zone] initWithString:self];
}
对于 NSObject.mm方法 - (id)copy { return [(id)self copyWithZone:nil]; } - (id)mutableCopy { return [(id)self mutableCopyWithZone:nil]; } NSString.m调用 - (id)copyWithZone:(NSZone *)zone { if (NSStringClass == Nil) NSStringClass = [NSString class]; return RETAIN(self); } - (id)mutableCopyWithZone:(NSZone*)zone { return [[NSMutableString allocWithZone:zone] initWithString:self]; }
由此可见 在可变类型中 copy也是深复制,但是类型变成了 普通类型,不能再增加或者减少集合元素了
在普通类型中 使用mutableCopy 也是深复制,类型变成了 可变类型...
NSString *haha = @"hahahhahahah";
NSLog(@"%p\n%p",haha,[haha mutableCopy]);
2016-08-15 17:42:09.843 dailylife[69904:5024325] 0x10f6fa390
0x7f8079c41f80
Printing description of haha:
hahahhahahah
Printing description of haha:
hahahhahahah
Printing description of haha:
(NSMutableString) NSMutableString = {
NSString = {
NSObject = {
isa = __NSCFConstantString
}
}
}
同理:NSString NSArray NSDictionary
参考:
http://ios.jobbole.com/87987/
posted on 2016-08-15 17:14 ACM_Someone like you 阅读(326) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)