ios拷贝小议

简介: 1.copy vs mutableCopy copy,对于不可变的对象,简单的指向其内存.对于可变对象,复制内存内容到新的内存中并把新的内存值赋值给左值. mutableCopy,始终复制到新的内存中,以一个可变的类型赋值给左值.

1.copy vs mutableCopy

copy,对于不可变的对象,简单的指向其内存.对于可变对象,复制内存内容到新的内存中并把新的内存值赋值给左值.

mutableCopy,始终复制到新的内存中,以一个可变的类型赋值给左值.

2.copy vc retain

retain,引用计数+1,内存地址赋值给左值.

copy,对于不可变对象的,相当于retain;对于可变对象,则是深拷贝赋值.

举例:

    NSString* a = [NSString stringWithFormat:@"%@",@"this is a"];

NSString* b = [a copy];

NSString* bb = [a retain];

NSString* cc = [a mutableCopy];//实际上cc应该是NSMutableString类型

NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);

//输出3,3,3,1
    NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];

NSString* b = [a copy];//不可变的b

NSString* bb = [a retain];//实际类型是NSMutableString的bb

NSString* cc = [a mutableCopy];//同上

NSLog(@"%d,%d,%d,%d",[a retainCount],[b retainCount],[bb retainCount],[cc retainCount]);

//输出2,1,2,1

 

3.一些问题

通过上面2点,思考下面的问题

我们通常如果这样定义一个变量

@property(nonatomic,copy)  NSMutableString* mString;

然后这样使用

@synthesize mString;

NSMutableString* a = [NSMutableString stringWithFormat:@"%@",@"this is a"];

self.mString = a;

[mString insertString:@"m-" atIndex:0];

 

能通过么?当然不能,赋值后的mString是NSString类型的,不可变.如果需要可以改变就需要自己定义属性函数.

-(void)setMString:(NSMutableString *)m

{

mString = [m mutableCopy];

}



-(NSMutableString *)mString

{

return mString;

}

(当然,NSMutableString不是线程安全的,一般都建议私有之:@private;或者一定要用的话以NSString作为对外接口类型)

4.NSCopying NSMutableCopying NSCopyObjective()

NSCopying就是复制一个对象

NSMutableCopying就是深拷贝一个对象,让两个对象的改变互不影响

(其实上面着两个完全看你怎么写啦)

NSCopyObject(self,0,zone)就是简单的赋值=

(在涉及到ns对象的时候,NSCopyObject不建议使用)

注意看下面一个例子:

@interface ClassB : NSObject <NSCopying>{
NSString* stringB;
}

@property(nonatomic,copy) NSString* stringB;

@end
-(id)copyWithZone:(NSZone *)zone

{

ClassB *b = NSCopyObject(self, 0, zone);

// 使用NSCopyObject时的正确赋值方法,因为没有涉及到原来的内存指针什么事

b->stringB = @"what";

// 看看被注释的这个错误方法,由于setter方法的特性,原来的stringB指向的内存的retainCount减一

// 而由于NSCopyObject的特性,两者又是指向同一个地址的,所以,原类中stirngB指向的地址已经释放了,之后你dealloc中在释放一次?!.就出错啦

// b.stringB = @"what";

return b;

}



参考:http://stackoverflow.com/questions/2002174/copy-mutablecopy

http://stackoverflow.com/questions/4995254/nsmutablestring-as-retain-copy

http://robnapier.net/blog/implementing-nscopying-439#comment-1312
 
注释:可变对象mutable比如NSMutableString,NSMutableArray等
       不可变对象immutable比如NSString,NSArray等
目录
相关文章
|
设计模式 资源调度 Kubernetes
微前端应用 乾坤 开发实践
乾坤作为一款微前端应用框架,可以有效的实现前端应用程序的模块化设计,代码复用和可维护性。下面我们来通过实际开发来看看乾坤的使用方式以及实践。
|
机器学习/深度学习 传感器 人工智能
AI:国内外人工智能产业应用图谱应用层/基础层详解
AI:国内外人工智能产业应用图谱应用层/基础层详解
AI:国内外人工智能产业应用图谱应用层/基础层详解
|
8月前
|
关系型数据库 分布式数据库 数据库
PolarDB开源数据库进阶课8 任意时间点恢复(PITR)
本文介绍了如何在PolarDB RAC一写多读集群中进行时间点恢复(PITR)。实验环境依赖于Docker容器中的loop设备模拟共享存储。首先,确保已开启实时归档并完成全量备份。接着,在主节点生成数据并创建恢复点。然后,通过修改配置文件和添加恢复标记文件,使用备份和归档日志将数据库恢复到指定的时间点。最后,验证数据是否已成功恢复,并关闭恢复库。参考了多个相关文档和系列文章,详细步骤和配置请参阅提供的链接。
145 0
|
10月前
|
开发工具 Android开发 iOS开发
Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
本文旨在深入探讨Android与iOS两大移动操作系统在技术架构、开发环境及市场表现上的核心差异,为开发者和技术爱好者提供全面的视角。通过对比分析,揭示两者如何塑造了当今多样化的移动应用生态,并对未来发展趋势进行了展望。 ####
|
数据采集 人工智能 PyTorch
极智AI | 昇腾CANN ATC模型转换
大家好,我是极智视界,本文介绍一下 昇腾 CANN ATC 模型转换。
703 0
|
算法 安全
分布式光伏储能系统的优化配置方法(Matlab代码实现)
分布式光伏储能系统的优化配置方法(Matlab代码实现)
417 0
|
人工智能 编解码 Java
用户投稿:这款 AI 编码工具 CodeFuse 很惊艳
在 AI 时代,总是会迅速出现很多惊艳的产品工具,这些效率工具,在很大程度上推动了科技的进步。特别是在编程领域,各类工具更是层出不穷,从 GitHub Copilot 到 CodeGeeX,再到通义灵码,有很多工具在不断涌现。今天,我想和大家分享一款我最近发现的、非常出色的编程辅助工具 —— CodeFuse。
610 0
用户投稿:这款 AI 编码工具 CodeFuse 很惊艳
|
资源调度 前端开发 JavaScript
前端技术栈
前端技术栈
349 0
|
弹性计算 应用服务中间件 数据中心
阿里云香港服务器24元1个月、288元一年,补货!
阿里云香港服务器24元1个月、288元一年,补货!阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品,中国电信CN2高速网络高质量、大规格BGP带宽,运营商精品公网直连中国内地,时延更低,优化海外回中国内地流量的公网线路,可以提高国际业务访问质量
|
机器学习/深度学习 人工智能 自然语言处理
MGM、MolGPT、PAR、Uni-Mol、K-Bert、MolCLR…你都掌握了吗?一文总结生物制药必备经典模型(1)
MGM、MolGPT、PAR、Uni-Mol、K-Bert、MolCLR…你都掌握了吗?一文总结生物制药必备经典模型
447 0