copy修饰NSArray strong修饰NSMutableArray

NSArray与NSMutableArray应该使用copy还是strong? 先说标题的正确答案: @property (nonatomic,copy) NSArray *immutableArray; @property (nonatomic,strong) NSMutableArray *mutableArray; 其他集合: NSArray,NSDictionary,NSSet -> copy NSMutableArray,NSMutableDi... 阅读详情

strong与copy修饰符
  • strong修饰的属性,对该属性赋值时发生指针拷贝,即浅拷贝;
  • copy修饰的属性,对该属性赋值时发生内容拷贝,即深拷贝。(存在特殊Case)

通过重写对象的setter方法实现。

当将不可变对象赋值给copy修饰的不可变对象时,也是发生浅拷贝。这算是一种优化,验证见下文。

对数组而言,浅拷贝即拷贝了指向数组的指针;深拷贝即拷贝了数组中存储的内容,而这个深拷贝是通过调用copy方法实现。

copy与mutableCopy方法

以下代码发生崩溃,为什么?

@property (copy, nonatomic) NSMutableArray *copAry;

- (void)testCrash {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@1, @2, @3, nil];
    self.copAry = arr;
    [self.copAry removeObject:@1]; // 直接崩溃
    NSLog(@"self.copyAry = %@", self.copAry);
}

arr赋值给self.copAry,依据上面原则,会调用copy方法实现深拷贝。

注意: OC中不管是集合类对象(如:NSArray、NSMutableArray、NSSet…)还是非集合类对象(如:NSString…)接收到copy和mutableCopy消息时遵循以下原则:

  • copy方法返回的都是不可变对象,因此如上代码中,self.copAry即为不可变对象,对不可变对象调用可变对象的方法就会Crash;
  • mutableCopy方法返回的都是可变对象。

因此,如果我们使用strong来修饰self.copAry,则在self.copAry = arr;时发生浅拷贝,只是拷贝了arr的指针,还是指向的原数组,还是可变对象。便不会发生Crash。

NSArray为什么需要用copy来修饰?
@property (strong, nonatomic) NSArray *arr1;
@property (copy, nonatomic) NSArray *arr2;

// 为什么 NSArray 需要使用 copy
- (void)testUseCopyWithAry {
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@(1), @(2), @(3), nil];
    self.arr1 = arr;
    self.arr2 = arr;
    
    [arr addObject:@(4)];
    NSLog(@"arr1 = %@, arr2 = %@", self.arr1, self.arr2);
    
    /* 输出结果:
     arr1 = (
         1,
         2,
         3,
         4
     ), arr2 = (
         1,
         2,
         3
     )
     */
}

如果对一个strong修饰的NSArray对象A赋值一个NSMutableArray对象B,对于A对象而言它是不可变的,但是使用strong修饰,赋值时发生了浅拷贝,A、B对象指向了同一个数组,因此对B的修改将会影响到A(如上代码)。一般这并不是我们期望的,因此我们使用copy来修饰NSArray对象来避免上述情况。

对象间赋值时测试例子
 - (void)test01 {
    NSArray *array = @[@1,@2,@3,@4];
    
    NSArray *copyArr = [array copy];
    NSArray *mCopyArr = [array mutableCopy];
    
    NSMutableArray *mcArr = [array copy];
    NSMutableArray *mmCopyArr = [array mutableCopy];
    
    NSLog(@"array:%p--copyArr:%p--mCopyArr:%p--mcArr:%p---mmCopyArr:%p",array,copyArr,mCopyArr,mcArr,mmCopyArr);
    
    /*  输出结果
     array:     0x60000024ce10
     copyArr:   0x60000024ce10
     mCopyArr:  0x60000024cd80
     mcArr:     0x60000024ce10
     mmCopyArr: 0x60000024ce70
     */
    
}

 - (void)test02 {
    NSArray *tarray = @[@1,@2,@3,@4];
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObjectsFromArray:tarray];
    
    NSArray *copyArr = [array copy];
    NSArray *mCopyArr = [array mutableCopy];
    
    NSMutableArray *mcArr = [array copy];
    NSMutableArray *mmCopyArr = [array mutableCopy];
    
    NSLog(@"array:%p--copyArr:%p--mCopyArr:%p--mcArr:%p---mmCopyArr:%p",array,copyArr,mCopyArr,mcArr,mmCopyArr);
    /* 输出结果
     array:     0x60000024cd20
     copyArr:   0x60000024cc90
     mCopyArr:  0x60000024ce40
     mcArr:     0x60000024cde0
     mmCopyArr: 0x60000024d020
     */
}

总结:

  • 对不可变对象(如:NSArray对象)发送copy消息,返回不可变对象,这其中并没有发生深拷贝,仅是拷贝了指针而已;
  • 对不可变对象发送mutableCopy消息,返回可变对象;对可变对象发送copy消息,返回不可变对象;对可变对象发送mutableCopy消息,返回可变对象,这其中均发生了深拷贝,即拷贝了对象的内容。

当然在 iOS 中并不是所有的对象都支持copy,mutableCopy,遵守 NSCopying协议的类可以发送 copy消息,遵守NSMutableCopying 协议的类才可以发送 mutableCopy消息。
假如发送了一个没有遵守上诉两协议而发送 copy或者 mutableCopy, 那么就会发生异常。但是默认情况下iOS中的类并没有遵守上述两个协议。

如果想使用copy那么就必须遵守NSCopying, 并且实现 copyWithZone:方法,如果想使用mutableCopy那么就必须遵守 NSMutableCopying, 并且实现 mutableCopyWithZone:方法。

第五节 Amesim《直动型溢流阀HCD建模》HCD5 学习资料 利用HCD原则创建直动型溢流阀的界面。这可能包括图形化表示直动型溢流阀的工作原理、操作方式和调节方法。这样的界面应当直观且易于理解,使用户能够轻松了解阀门的功能和使用方法。 阅读详情

相关推荐

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1006

使用NSArray时,到底用strong修饰还是copy修饰

iOS开发人员都知道,使用NSMutableArray时是用strong修饰,例如: @property (nonatomic,strong) NSMutableArray * mutableArray; 那么,NSArray呢?好像很多人都直接使用strong,而且网上还有很多人说除了NSString用copy,其他对象类型都用strong。 问题来了:当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?会导致不易察觉的问题

漫漫人生路 5785

MFC Tab Control控件完全指南:从基础使用到高级定制

本文详细介绍了MFC中TabControl控件的使用方法和高级技巧。主要内容包括:1) TabControl基础属性设置与绑定;2) 样式定制和外观自定义;3) 创建派生类实现扩展功能;4) 动态页面管理和子对话框控制;5) 高级功能如标签拖拽排序和右键菜单。通过完整代码示例,展示了从基本应用到复杂场景的实现方案,包括多标签页管理、自定义绘制、动态添加/删除标签等核心功能,为MFC开发者提供了全面的TabControl开发指南。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 259

关于NSArray使用时用strong修饰还是copy修饰问题测试

大家都知道,使用NSMutableArray时是用strong修饰,例如: @property (nonatomic, strong) NSMutableArray * mutableArray; 但是,NSArray呢?我看大多数人都直接使用strong,而且网上还有很多人说除了NSString用copy,其他对象类型都用strong。 那么,问题来了:当用strong修饰NSArr

Ethan_LG的专栏 1万+

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2640

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5281

iOS内存管理(6)--NSArray与NSMutableArray用copy修饰还是strong

一、NSMutableArray 被copy、strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。 举例如下: (1)copy: @property (nonatomic, copy  ) NS

Winzlee的专栏 2万+

MATLAB - 激光雷达 - 相机联合标定(Lidar-Camera Calibration)

激光雷达传感器和相机通常在自动驾驶应用中结合使用,因为激光雷达传感器收集三维空间信息,而相机则以二维图像捕捉空间的外观和纹理。您可以融合来自这些传感器的数据来改进物体检测和分类。激光雷达-相机标定可以估算出一个变换矩阵,给出两个传感器之间的相对旋转和平移。在进行激光雷达-相机数据融合时,您可以使用该矩阵。本图说明了激光雷达和相机标定 (LCC) 过程的工作流程,我们使用棋盘格作为标定对象。我们从激光雷达和相机数据中提取棋盘角和平面,然后在它们的坐标系之间建立几何关系,进行标定。

机器人控制与仿真应用 7371

关于NSString、NSArray、NSDictionary作为属性的时候为什么要用copy,而非strong

关于NSString、NSArray、NSDictionary作为属性的时候为什么要用copy,而非strong

xiazhengcheng的博客 422

学Simulink--基础光伏储能场景实例:基于Simulink的光储微电网主从控制策略仿真

摘要:本文详细介绍基于Simulink的光储微电网主从控制策略仿真方法。通过"储能V/f控制+光伏PQ控制"架构,实现孤岛运行时电压频率稳定和功率平衡。文章包含系统建模步骤、核心控制算法实现(附MATLAB代码)、三种典型工况仿真测试(稳态、光伏突变、负荷波动),结果显示系统满足电压偏差<±2.5%、频率偏差<±0.3%、动态响应<1s的性能要求。最后提出双主冗余、分层控制等优化方向,为光储微电网控制提供完整仿真解决方案。

amy_mhd的博客 74

深入解析:武汉光庭信息技术 Android CarPlay 开发岗位的技术要求与面试准备(大连)

武汉光庭信息大连分部招聘Android CarPlay开发工程师,要求专科以上学历及2年以上Android开发经验,需精通CarPlay集成技术与车载系统开发。该职位涉及Android底层框架修改、CarPlay协议实现及车规级系统开发,需处理USB/HID驱动、图形合成等技术难点,并确保通过Apple严格认证。求职者需具备扎实的Android开发能力,熟悉车载环境特殊性,包括系统稳定性保障、人机交互适配等技术要点。文章深度解析了职位技术内涵,并提供面试问题与参考答案,帮助求职者全面准备这一复合型技术岗位。

郑伟强dev的专栏 400

细说copy与strong

细说copy与strong一、NSArray进行copy上面的代码也可以换成属性值进行copy,如下:二、NSMutableArray进行copy这时候做修改前面数组的操作,观察结果如下:三、NSMutableArray的copy属性变成strong总结 一、NSArray进行copy NSArray *array = @[@"I ",@"am ",@“zd !”]; NSArray *arra...

逸轻紫的博客 583

把 SAP Fiori Launchpad Designer 的 Catalog 与 Group 传输讲透:从 CONF、CUST 到 Transport Request 的完整理解

SAP Fiori项目中,catalog和group的传输问题往往源于对FLPD层次模型的理解不足。FLPD包含configuration(系统级)和customizing(客户端级)两个层面,分别对应workbench request和customizing request传输方式。常见误区包括:混淆/UI2/FLPD_CONF和/UI2/FLPD_CUST入口、未提前创建传输请求、不了解层次覆盖机制(customizing会覆盖configuration)。当客户端修改configuration层的对象

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 101

--NSArray与NSMutableArray用copy修饰还是strong(转)

一、NSMutableArray 被copy、strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。 举例如下: (1)copy: @property(nonatomic,copy )NSMutab...

weixin_30892763的博客 188

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[Objective-C]strong、copy在NSArray和NSMutableArray的应用区别

两个问题 1. 使用strong修饰NSArray会有什么问题? 2. 使用copy修饰NSMutableArray会有什么问题? 1. 使用strong修饰NSArray的问题 // // StrongCopyTest.h // StudyRuntime // // Created by Andy Liu on 2018/5/14. // Copyright © 2018年 Andy...

混迹于移动互联网和手机行业 806

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

为什么NSMutableArray必须用strong,而NSArray必须用copy?

1.NSMutableArray: @property (nonatomic, copy) NSMutableArray *mArray;//等同于 - (void)setMArray:(NSMutableArray *)mArray { _mArray = mArray.copy; } mArray属性就成了NSArray,NSMutableArray只能用strong修

ioswl的博客 5853

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于 strong,copy,深拷贝,浅拷贝 的整理

I. strong,copy 先上结论: String:推荐采用 copy 或 strong 进行修饰。对于来源于不可变的字符串,两者无影响(copy需执行一次判断,会些许影响性能);对于来源于可变的字符串,需采用 copy 进行修饰 MutableArray:需采用 strong 进行修饰。若采用copy,对赋值对象进行深copy,mutableArray等同于Array,再进行mutab...

mscinsidious的博客 549

iOS学习笔记 strong与copy 深浅复制

strong copy 对一般的对象没有什么区别,但是对于array string 有一些注意的地方 当strong与copy用在NSArray对于对象来说没有太大的区别 结果: 由结果可知都是指向同一个对象地址a,此刻a的retainCount=3 2.在指向NSMutableArray 执行结果: 有结果可知: copy是进行了一次深复制对

大白天 389

NSString,NSArray,NSMutableArray分别用什么属性修饰,原因是什么?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34356138的博客 387

用copy 还是 strong?

NSArray与NSMutableArray用copy修饰还是strong 这个是原文  http://blog.youkuaiyun.com/winzlee/article/details/51752354   一、NSMutableArray 被copy、strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了...

weixin_34075551的博客 77

strong与copy,用错了,有时候还会崩溃,不知道问题出在哪里,有时候就有这里

@property (nonatomic, copy) NSMutableArray *muArr1; // 用copy修饰的话,证明这个数组是不可变的,如果这个数组使用了可变数组的方法,那么就会崩溃.要用strong修饰才行。这是对可变类型而言 @property (nonatomic, strong) NSMutableArray *muArr2; @prop

u010971348的博客 395

修饰属性

当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。 当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。 转载于:https://www.cnblogs.com/GJRBlog/p/6202851.html...

weixin_30338481的博客 66

OC 属性 strong 和 copy 的那些事

一直对 strong 和 copy 不甚了解,今天决定做个小实验。 1. 先创建四个属性 @property (nonatomic, strong) NSArray *arrStrong; @property (nonatomic, copy) NSArray *arrCopy; @property (nonatomic, strong)...

weixin_33898876的博客 195

属性 Copy 读后感

Property copy attribute 读后感 原文 不可变字符串,可变字符串,copy,mutableCopy。两两组合,只有【不可变字符串 copy】是浅拷贝,其他组合都是深拷贝 可变字符串属性使用 copy 修饰的原因:因为可变字符串 setter 方法会调用 copy 进行的是深拷贝,修改外层字符串值不会影响属性值。若可变字符串用 strong 修饰,则属性和外层字符串指向的是同...

csdn_coder_zxq的博客 210
上一篇: iOS APP间跳转
下一篇: 关于UITableView UI与数据源不同步造成的Crash
QIYUBLOG
博客等级 码龄10年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值