NSArray和NSString copy属性问题

iOS Strong和Copy 理解 问题描述 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰。为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化。 代码示例  首先声明了两个NSString属性,如下: @pro... 阅读详情

什么时候加copy

在定义属性的时候,如果属性的数据类型有对应的Mutable类型,那么该非Mutable类型属性要指定为为copy。比如:NSString/NSMutableString、NSArray/NSMutableArray、NSDictionary/NSMutableDictionary、NSSet/NSMutableSet。如下图:


测试例子

下面示例说明:

  • 在mutable类型再给对应非mutable类型赋值的时候,对应有mutable的类型一般都需要在属性里面指定copy,否则非mutable类型的数据是不稳定的。

  • 非mutable类型指定为copy后,copy的只是MutableArray的数组索引,里面的数据元素依然和MutableArray中的对象元素地址是一样的。

  • 下面例子对NSArray做实验,也适用于NSString。

 

@interface  QRATestViewController ()
 
@property  (nonatomic, copy) NSArray *testCopyArray;
@property  (nonatomic, strong) NSArray *testStrongArray;
// 带mutable的类型定义属性不能加copy
@property  (nonatomic, copy) NSMutableArray *testMutableArray;
 
@end
 
- (IBAction)testTouchUp:(id)sender {
     // 在这里可以做一些简单的测试工作
     NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
     [mutableArray addObject:@ "111" ];
     
     self.testCopyArray = mutableArray;
     self.testStrongArray = mutableArray;
     
     [mutableArray addObject:@ "2222" ];
     
     // testCopyArray中的元素不包含2222,但是testStrongArray中的数组元素中包含2222
     // 表示mutableArray数组元素的变化不会影响到testCopyArray
     NSLog(@ "%@  %@" , self.testCopyArray, self.testStrongArray);
     
     // 输出的对象地址是一样的,表示testCopyArray中的元素依然是原先对象
     NSLog(@ "%p  %p" , self.testCopyArray[ 0 ], mutableArray[ 0 ]);
     
     // 因为testMutableArray带了copy,所以这里默认是copy不是mutableCopy,导致下面一行crash
     self.testMutableArray = mutableArray;
     [self.testMutableArray addObject:@ "333" ];
     
     NSLog(@ "%@" , self.testMutableArray);
}

参考链接

 

对可修改类型的属性使用copy特性 前两天去网易面试的时候面试官在问内存管理特性的时候问到了这样一个问题:能不能对一个是可变类型的属性采用copy特性,我当时的回答是不能,面试官问为什么不能,当时没有想到原因,但是因为自己遇到过把一个NSMutableArray的属性声明为copy特性时出现了bug,所以知道这样做是不行的,但是具体为什么不行没有深入去了解。今天详细做了一个测试发现了这么做不可行的原因,废话不多说,先上代码:NSStr 阅读详情

相关推荐

HDMI2.1接口保护指南:从浪涌损坏案例看RK3588板子的ESD设计要点

本文深入探讨了HDMI2.1接口在RK3588板子上的ESD防护设计要点,通过真实案例分析了浪涌损坏的原因及解决方案。重点介绍了TMDS信号链路的四级防护体系、TVS管选型误区以及连接器与PCB的协同设计策略,帮助工程师有效避免静电放电导致的HDMI无输出故障。

weixin_29305337的博客 447

关于NSarray copy问题

//在集合类对象中,对 immutable 对象进行 copy,是指针复制, mutableCopy 是内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:[immutableObject copy] // 浅复制[immutableObject mutabl...

weixin_30322405的博客 399

深度学习——VGG16模型详解

1、网络结构 VGG16模型很好的适用于分类和定位任务,其名称来自牛津大学几何组(Visual Geometry Group)的缩写。 根据卷积核的大小核卷积层数,VGG共有6种配置,分别为A、A-LRN、B、C、D、E,其中D和E两种是最为常用的VGG16和VGG19。 介绍结构图: conv3-64 :是指第三层卷积后维度变成64,同样地,conv3-128指的是第三层卷积后维度变成128; input(224x224 RGB image) :指的是输入图片大小为224244的彩色图像,通道为

橙子的博客 12万+

OC的深拷贝与浅拷贝--NSArray与NSMutableArray应该使用copy还是strong?

Objective-C中对象的拷贝分为深拷贝和浅拷贝。另外还有容器类对象及非容器类对象的差别: 1. 对非容器类对象(如NSString、NSMutableString类对象)使用浅拷贝:拷贝的是对象的地址,没有新的内存被分配,只是原来的那块内容多了一个指针指向。也就是说新对象跟原对象都是指向的同一个内存地址,那么内容当然一样。 2. 对非容器类对象(如NSData、NSMutableData类

学海无涯苦作舟 6395

zemax混合式非序列模拟

注意不要点击左侧的非序列模式,那个时纯粹的非序列,会清除序列模式的数据。第2、4、6透镜材质为空气,是为了让光线进入到多重透镜内部。这时普通的优化方式会失败。平行光束经过多焦透镜时,会汇聚在不同焦距处。所以还需要控制能量的大小,进行优化。接下来用非序列模式设计一个多焦透镜。像面的孔径为圆形通光孔:0-1.2。透镜不同位置处有不同的聚焦位置。透镜的z轴位置相同,重合。

fendoudecheng的博客 3068

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

Vivado ILA抓DDR信号(各种IO信号:差分、ISERDES、IOBUFDS等)

千歌叹尽执夏的博客 1102

NSArray copy 问题

转载自:http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html 我知道iOS中都是指针 也就是说 如果 有一个array ,然后申明一个 array1 = [array copy];那么array1和array是指向同一片内存的,所以当你改变array1 的内容,那么array 也就自然跟着变化了,于是乎便有了以下代码和出现的问题: N

chfg883721的博客 593

GEE训练教程:如何批量从Google assets中将时序影像批量导出到Google drive

本文介绍了一种使用Google Earth Engine(GEE)批量导出2000-2023年叶绿素a(Chl-a)浓度数据的方法。通过JavaScript代码自动生成多个年份的导出任务,将数据保存至Google Drive指定文件夹。文章详细说明了代码参数配置、使用步骤和注意事项,包括资产命名规则验证、导出任务启动方式,以及分辨率、区域范围等关键参数的调整建议。同时提供了常见问题的解决方案,如处理缺失年份数据、解决导出像素超限等问题。该方法可显著提高多年份Chl-a数据批量导出的效率,适用于水体环境研究的

此星光明博客 91

iOS NSString,NSArray,NSDictionary的Copy属性使用

思考下的一些问题总结,如有错误,请斧正。 在平时使用NSArray,NSDictionary以及NSString的过程中,经常会默认写了strong 属性,或者按照规范使用Copy,在Apple的规范中,是提倡我们使用copy的属性。基本原理 简单来说,copy属性就像字面意思一样,在赋值的时候会系统自动copy一份内存出来,修改新的变量,并不会导致原先的变量出现改变 即:NSMutableStri

邦Ben的专栏 806

【WorkBuddy从入门到精通实战教程】实战案例 第 41 章 论文阅读与文献综述

本文系统讲解如何用WorkBuddy高效阅读论文并撰写文献综述。针对“读了一天没记住”的痛点,提出“三遍阅读法”:快速评估相关性、结构化提炼核心内容、批判性分析局限。结合提示词工程,实现单篇精读、多篇对比与综述框架搭建,显著提升效率。强调学术诚信,严防AI幻觉,要求所有引用与数据必须回源核对。最终目标是借助AI辅助理解与组织,但坚持自主思考与写作,真正掌握科研能力。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 140

大模型复杂问答能力评测框架:从原理到实践

在人工智能领域,大语言模型(LLM)的评估是衡量其实际应用价值的关键环节。其核心原理在于通过系统化的评测框架,对模型的理解、推理、整合与表达能力进行量化分析。传统的NLP基准测试往往侧重于事实性检索或简单推理,难以全面反映模型在应对多跳推理、隐含条件、长上下文整合等复杂现实任务时的真实性能。因此,专门针对复杂问答设计的评测技术应运而生,其价值在于为模型选型、效果优化和瓶颈诊断提供数据驱动的科学依据。该技术广泛应用于需要深度逻辑判断的业务场景,如智能投顾、法律咨询、医疗诊断等。本文聚焦的`tan92hl/Co

weixin_28679635的博客 362

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

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

Winzlee的专栏 2万+

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3689

copy关键字

用途:1.NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;block 也经常使用 copy 关键字,具体原因见官方文档:Objects Use Properties to Keep Track of Blocks:2.b...

212

SAP B1中文培訓教材_SDK

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

iOS copy 关键字的使用

iOS 开发中 copy 关键字的使用

风中流浪的博客 2506

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

推荐NSString类型的属性用copy

因为如果你用retain, 你保证不了调用者是给你传的是NSString还是NSMutableString,  如果传的是NSMutableString, 那你的这个NSString属性内容就有可能受调用者的影响,  而NSString的属性,通常都是不希望被调用者改变的。  不只是NSString,其他的不可变类, NSArray, NSDictionary, NSSet等,都

majiakun1的专栏 552

NSString和NSMutablestring,copy和strong(转载)

1、http://www.cocoachina.com/ios/20150512/11805.html 2、http://blog.youkuaiyun.com/winzlee/article/details/51752354 NSString和NSMutableString之间的深拷贝和浅拷贝的问题: NSString 使用copy NSMutableStr...

前端码农 156

strong和copy的区别

问题描述 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰。为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化。 代码示例 还是结合代码来说明这个情况 @interfa

qq_20518299的专栏 333

定义属性时NSArray,NSString,NSDictionary为何要用copy

新人一枚,第一次写博客,有写错的敌方请见谅,一定认真改正。进入正题: 刚开始学习property的时候没有太认真学这一段,就那么几种类型,对应着写就完事了,也没想太多,最近脑袋欠抽了,突然考虑了一下这个问题,为什么NSArray,NSString,NSDictionary要用copy,问了几个同事,他们也是模棱两可的,解释不出为啥,只知道就那么用,不得已只能自己尝试了。从网上查了一些资料,又自己

Maybeyourdad的博客 1211

iOS NSString,NSArray,NSDictionary声明属性关键字

这几天看面试题,就看到这个问题,NSSArray类型做变量声明属性时,属性关键字用什么比较好?想当然的就是用strong来修饰,只知道NSString类型做变量声明属性是copy,其实也不知道为什么.今天晚上就在网上查询了下究竟是为什么.在网上就看到个例子,下面上代码:创建了Person类,里面声明个name属性,关键字用copy@property (nonatomic, copy)NSString

学到老 1535

用@property声明的NSString, NSArray, NSDictionary 为什么要用copy ?

首先呢, 给大家看一个例子在上图中, 我们用的 strong 修饰的字符串, 当我们把一个可变的字符串赋值给它之后, 发生了一些, 我们并不想要的结果. 这个结果是由于多态的特性导致的. 父类指针指向了子类的对象, 当这个子类是可变的对象, 恰好又发生了修改的时候, 就影响到了父类的属性, 所以出现了我们看到的结果而如果我们用copy来修饰字符串的话, 就不会有这些问题copy 字面意思就是 “复制

梁梁的博客 956

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

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

xiazhengcheng的博客 422

NSString为什么用copy而不是strong,NSMutableString为什么用strong而不是用copy(或者NSArray及NSMutableArray等)

以NSString以及NSMutableString为例 @property (strong,nonatomic) NSString *sStr; @property (copy, nonatomic) NSString *cStr; - (void)test: {      NSMutableString *mStr = [NSMutableStrin

GofeyLee的博客 1424

NSString NSMutableString NSArray NSMutableArray Block 分别用哪些修饰?

NSString NSMutableString NSArray NSMutableArray Block 分别用哪些修饰?

lin_transform的博客 1630

NSString NSArray NSDictionry属性 用Copy修饰

我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。 示例 我们定义一个类,并为其声明两个字符串属性,如下所示: 1 2 3 4 @interface TestS

ioschenlu的博客 1173
上一篇: 关于前后端接口的可扩展性思考
zcube
博客等级 码龄17年 170粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值