copy,retain,strong的区别

IOS中(assign,retain,copy,weak,strong)的区别以及nonatomic的含义 主要介绍了我们在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong中的一个,他们的区别,需要的朋友可以参考下 立即下载

      之前的编码中,对于NSString的property修饰,习惯性使用copy,只是粗略的知道copy属于深复制,retain/strong属于浅复制,并没有对其深究。最近需要详细了解这一块知识,在网上搜索相关内容,并且用代码验证,查看对比了内存地址,做一些总结。

        一、之前对于copy和retain/strong的区别理解是这样的:

        copy是复制了源对象所在内存空间的数据,放入目的对象指针指向的内存空间,并且令目的对象引用计数为1,对于源对象的引用计数没有影响;源对象内容的改变不会影响到目的对象。

       retain/strong是目的对象指针指向源对象的内存空间,源对象的引用计数+1;源对象的改变会影响到目的对象。

       

      mutablecopy返回的是可变的对象,copy返回的是不可变的对象。


       二、代码验证探究

     1、源对象为不可变 NSString

   

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSString*str = @"test";  
  2. NSString* retainStr = [str retain];  
  3. NSString* copyStr = [str copy];  
  4. NSMutableString* mcopyStr = [str mutableCopy];  
  5. NSLog(@"str addr = %p",str);  
  6. NSLog(@"retainStr addr = %p",retainStr);  
  7. NSLog(@"copyStr addr = %p",copyStr);  
  8. NSLog(@"mcopyStr addr = %p",mcopyStr);  
输出如下:

       

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. str addr = 0x4598  
  2. retainStr addr = 0x4598  
  3. copyStr addr = 0x4598  
  4. mcopyStr addr = 0x8caf630  

分析:

retain的对象毫无悬念,还是源对象的内存地址;

copy的对象和我原来想的不一样,竟然和retain一样,也是源对象地址;这意味者并没有对源对象内容进行复制,而只是复制了指针而已。如此看来copy方法并不一定会复制源对象的内容。之所以复制,肯定是因为两个版本有所不同。而这里源对象是NSString不可变的,copy返回的也是不可变的,既然都不可变,那么这里的副本就没有多大意义存在,就如同使用字符串常量,系统会为我们优化,声明多个字符串,都是不可变且内容相同,那么系统就只申请一块内存,这个道理是一样的。指向一块内存就可以了,所以这里的copy和retain的作用是一样的。

mutablecopy的对象地址和源对象地址不同,说明重新开辟了内存,复制了一个副本。因为mutablecopy返回的对象是可变的,它的变动会影响到源对象,所以需要拷贝一份。


源对象为可变的NSMutableString

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NSMutableString* str = [NSMutableString stringWithString:@"test"];  
  2. NSString* retainStr = [str retain];  
  3. NSString* copyStr = [str copy];  
  4. NSMutableString* mcopyStr = [str mutableCopy];  
  5. NSLog(@"str addr = %p",str);  
  6. NSLog(@"retainStr addr = %p",retainStr);  
  7. NSLog(@"copyStr addr = %p",copyStr);  
  8. NSLog(@"mcopyStr addr = %p",mcopyStr);  
输出结果如下:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. str addr = 0x8b7a130  
  2. retainStr addr = 0x8b7a130  
  3. copyStr addr = 0x8b751d0  
  4. mcopyStr addr = 0x8b7a170  

分析:

retain仍然和目的对象地址相同;

copy的地址和目的对象地址不相同,是因为源对象是可变的,目的对象不可变,当然需要两个不同的版本;

mutablecopy形成了一个新的副本。因为两个对象的改变会影响到对方,所以需要两个版本。


得到的结论:

1、对于copy来说,如果源对象是不可变的,那么是浅拷贝,没有必要深拷贝;如果源对象可变,为了安全性,深拷贝,生成副本。

2、对于mutablecopy来说,不管源对象是否可变,都是深拷贝。

因此我们在设置property的copy属性时,如果希望对象跟着源对象的值变化,那么就是用retain;如果希望对象保持独立的值,那就使用copy。当然这是在源对象为可变的情况下。


上面讨论的是NSString相关的retain/copy/mutablecopy,在oc里面所有实现了NSCopying和NSMutableCopying协议的类,都具有copy和mutablecopy这两个方法。这里引出了其他的oc对象的copy特性,它们是什么样的,下一篇进行探究。

欢迎指正!  

华为OD机试E卷 -猜字谜(Java & Python& JS & C++ & C ) 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下:请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词,都需要找到对应的谜底,如果找不到的话,返回”not found” 阅读详情

相关推荐

Delta并联机械手-Codesys实现以及正解逆解研究

由于Codesys的Robotics模块有Delta并联机械手的运动模型,因此借助Codesys的机械手运动模型,研究自己的正解逆解算法。

weixin_42386991的博客 5561

iOS之属性修饰符 retain、strong和copy区别测试

时不时会有点迷惑属性修饰符retain、strong、copy三者之间的区别,还是把测试过程记录下来好一点! 一、属性修饰符retain、strong、copy修饰字符串测试 先看代码,创建一个Person类,定义属性 #import <Foundation/Foundation.h> @interface Person : NSObject @property (nona...

我爱编程持之以恒 910

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 722

由NSString的copy和strong/retain引出o-c的copy机制 (一)

之前的编码中,对于NSString的property修饰,习惯性使用copy,只是粗略的知道copy属于深复制,retain/strong属于浅复制,并没有对其深究。最近需要详细了解这一块知识,在网上搜索相关内容,并且用代码验证,查看对比了内存地址,做一些总结。         一、之前对于copy和retain/strong的区别理解是这样的:         copy是复制了源对象所在内存

u010810493的专栏 1154

2.4G/4G天线共存方案:Air8101多频段隔离设计实战(附波长计算表)

本文深入探讨了物联网设备中Wi-Fi 2.4GHz与4G LTE天线共存设计的实战方案。针对B40与2.4G频段紧邻带来的干扰挑战,文章系统性地提出了空间隔离、PCB布局优化、结构设计三重防线,并提供了关键的波长计算工具与系统级验证Checklist,旨在帮助工程师将多频段隔离设计从“玄学”变为可执行的工程规范。

weixin_29197051的博客 388

光电转换器件PMT,APD总结

PMT和APD都属于单点探测器,只能探测光子信息,可以通过扫描方式测光谱。 1. PMT PMT:光电倍增管,是光子技术器件中的一个重要产品,它是一种具有极高灵敏度和超快时间响应的光探测器件。 原理:光电倍增管是一种真空器件。它由光电发射阴极(光阴极)和聚焦电极、电子倍增极及电子收集极(阳极)等组成。当光照射到光阴极时,光阴极向真空中激发出光电子。这些光电子按聚焦极电场进入倍增系统,并通过进一步的二次发射得到的倍增放大。然后把放大后的电子用阳极收集作为信号输出。 优点:因为采用了二次发射倍增系统,.

Ammon_Zhang的博客 1万+

copy和strong的区别及使用不当引起的crash

copy属性用在需要深拷贝的地方,如:block属性。它会造成内存增加,使用不当会造成内存释放异常而崩溃。strong属性用在需要浅拷贝,保持对象不被立即释放。如:对象属性。 block属性全用copy,其它全用strong。 copy声明的对象变量只能对基本对象或block进行深拷贝,若是自定义对象不实现NSCoding协议(序列和反序列化)并声明为copy类型就会发生crash!

jia12216的专栏 1351

详解如何用爬虫工具批量采集阿里巴巴批发网商品数据

本文主要介绍如何使用后羿采集器的智能模式,免费采集阿里巴巴批发网商品的批发价格、发货时间、是否代发等信息。 采集字段: 商品标题、商品链接、图片链接、标签1、标签2、标签3、价格、30天成交数、 评价、店铺 功能点目录: 如何对采集字段进行配置 如何采集列表+详情页类型网页 采集结果预览: 下面我们来详细介绍一下如何免费采集1688批发网的商品数据,我们以“羽绒服女”为例,具体步骤如下: 步骤一...

weixin_43777427的博客 1万+

Copy 与 Strong 的正确使用姿势

—【Copy 与 Strong 的正确使用姿势】— 了解 Copy 与 Strong 的区别需要从内存管理方面知识切入。Strong是ARC下引入的修饰,相当于手动管理内存(MRC)下的retain,在相关代码下,常常看到有的人用copy修饰NSString,NSArray,NSDictionary…等存在可变与不可变之分的对象,常常会用copy,而不是strong。下面我们使用OC语言代码来解释一下strong与copy的区别: 【拓展:什么是深拷贝?什么是浅拷贝?】 深拷贝:内存复制,即copy了多个不

weixin_48992199的博客 704

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

KE17RS的博客 2875

【量化入门】Tushare库获取公募基金的历史净值

在本文中,我们将介绍如何使用Python的Tushare库获取公募基金的历史净值。

木头大左的博客 1138

assign weak retain strong copy关键字的区别

在iOS开发中定义@property属性时,经常用到assign、weak、retain、strong、copy等关键字。我们经常会考虑在何时应该使用哪个关键字,尤其是在面试的时候,经常会被问到这些关键字之间的区别,下面详细和大家探讨一下:   assign:用于对基本数据类型进行赋值操作,不更改引用计数。也可以用来修饰对象,但是,被assign修饰的对象在释放后,指针的地址还是存在的,也就是...

Andy Coding 7213

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

iOS中assign、retain、copy、weak、strong的区别以及nonatomic的含义

声明@property 属性时,括号中assign、retain、copy、weak、strong以及nonatomic到底是干啥的

Minecraft 6391

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

iOS中assign,copy,retain之间的区别以及weak和strong的区别,NSString什么时候用copy,什么时候用strong

@property (nonatomic, assign) NSString *title;  什么是assign,copy,retain之间的区别?  assign: 简单赋值,不更改索引计数(Reference Counting)。  copy: 建立一个索引计数为1的对象,然后释放旧对象  retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数

yq7788998的博客 1796

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

strong retain copy对于 nsstring,nsmutablestring的区别

#import "ViewController.h"@interface ViewController ()@property (retain,nonatomic) NSString *myRetainStr;@property (copy, nonatomic) NSString *myCopyStr;@property (strong, nonatomic) NSString *my...

aqokgik84582的博客 158

认识retain copy assign strong weak 的区别

retain: 引用计数+1 目的:不让这个对象释放掉——》MRC-》ARC  strong  weak  copy : 拷贝 为了原数据更改 影响使用之后的数据 -> 使用copy(拷贝的内容 必须遵守拷贝协议)数组 字典 字符串 assign:直接赋值 用于基本数据类型 -> 也包含演化出来的类型 int NSInteger BOOL float。。。 strong:强引用->不会被轻易

a729706106的博客 403

strong、weak、copy、retain和assign的区别

assign:assign一般用来修饰基本的数据类型,包括基础数据类型(NSInteger,CGFloat)和C语言数据类型(int,float,double,char)等等。因为assign声明的属性,是不会增加引用计数的,也就是说声明的属性释放后也就没有了,及时其他对象引用了它也不会保留,只会造成crash。但是及时被释放,指针却还在,成为了野指针,如果新的对象被分配到了这个内存地...

Murendless 393

IOS开发 strong,weak,retain,assign,copy nomatic 等的区别与作用

strong,weak,retain,assign,copy nomatic 等的区别copy与retain:1、copy其实是建立了一个相同的对象,而retain不是;2、copy是内容拷贝,retain是指针拷贝;  3、copy是内容的拷贝 ,对于像NSString,的确是这样,但是如果copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制...

plpldog的博客 1082

copy,assign,strong,retain,weak,readonly,nonatomic的区别

1、weak和strong区别 不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。  一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。  可能有个例子形容是妥当的。  想象我们的对象是一条狗,狗想要跑掉(被释放)。  strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如...

dinghui1875的博客 168

retain,copy,assign,strong,weak,autorelease,nonatomic,atomic等得使用及区别

很多人对OC的内存管理不是很理解,对retain,copy,assign,strong,weak,autorelease,nonatomic,atomic等的使用以及区别不是很了解,本人根据自己的理解整理了这一份材料,希望对大家有所帮助。 retain assign copy在@property中的使用实际上是通过控制set方法进行内存管理。 1、 copy:建立一个索引计数为1的对象,

Paddy的个人博客 640

property,strong,weak,retain,assign,copy,nomatic 的区别及使用

1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用 strong与weak2:weak的作用:在ARC环境下,所有指向这个对象的weak指针都将被置为nil。这个T特性很有用,相信很多开发...

plpldog的博客 359

iOS copy和retain、strong的区别

iOS copy和retain、strong的区别

AFun_day的博客 488

iOS中assign,copy,retain之间的区别以及weak和strong的区别

@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Reference Counting)。 copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 weak 和strong的区

Bad Boy 3360

strong,weak,retain,assign,copy,nomatic的区别

assign: 简单赋值,不更改索引计数(Reference Counting)对基础数据类 copy: 建立一个索引计数为1的对象,然后释放旧对象。对NSString retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 ,对其他NSObject和其子类 weak和strong的区别: weak和strong不同的是 当一个对象不再有

西毒 476
上一篇: iOS协议实现多继承
下一篇: Winform(XtraReport)实现打印方法(转载)
浮生丿未歇
博客等级 码龄10年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值