在iOS开发里面我们经常会进行NSMutable(可变类型的类,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData等)属性的声明,在声明时我们都知道要使用strong(强引用)来进行标识,但是很多人不知道为什么不能使用copy来进行标识,下面我们展开讨论一下:

1.为什么不能使用copy:

总所周知,所有的可变类都是继承于非可变类的,属于可变类的子类,拿NSMutableString类来举例,大家进入到NSMutableString类的.h文件可以看到它是继承于NSString类的,而且NSMutableString类并没有重写NSString类的copy方法,所以我们如果声明NSMutableString类属性时使用了copy进行标识,在我们对这个属性进行赋值时,调用的其实是NSString类的copy方法,拿到的实例对象其实是一个NSString的实例,而不是一个NSMutableString的实例,下面使用代码给大家验证一下:

从输出结果可以看到tempStr是一个NSMutableString对象,使用strong修饰声明的属性str只是对tempStr对象添加了一个引用计数,并没有产生新的对象实例,所以tempStr和str的class方法其实调用的是同一个对象的方法,所以输出的结果是一样的。而使用copy修饰声明的属性mstr在被赋值时,会调用tempStr对象的copy方法产生一个新的对象,而且从输出结果可以看到这个对象是NSString对象。

综上所述,NSMutable属性声明时不能使用copy进行修饰是因为NSMutable类并没有重写非可变类的copy方法,给属性赋值时,调用的是父类的copy方法,得到的对象是一个非可变对象。

2.使用了copy会怎样:

由于给对象赋值时得到的对象是非可变对象,所以我们使用该属性调用可变对象的特有方法时程序会奔溃(因为对象根本响应不了该方法),下面我们同样适用代码给大家验证一下:

tempStr对象和str属性的replaceCharactersInRange方法均执行成功,但是程序运行到[self.mstr replaceCharactersInRange:NSMakeRange(0, 1) withString:@""]这句代码时奔溃了,所以这个问题对程序的影响还是很大的,而且这个的bug很难被找出来,所以在声明NSMutable属性时一定要多加注意。

第一次写博客,希望对大家有所帮助,博文中有什么不足的地方希望各位大牛可以帮忙指出,大家一起交流进步

转载于:https://www.cnblogs.com/JohnWangYe/p/6972222.html

NSMutable属性声明时为什么不能使用copy相关推荐

  1. Vue中获取组件声明时的name属性

    在实际开发中,我们可能需要拿到组件声明时创建的一些属性,比较典型的话就是name属性,在实际开发中需要定位问题时,需要找到是哪一个组件,但是我们总不可能写代码的时候去先找到组件的name属性,然后复制 ...

  2. iOS: 属性声明strong和retain竟然不一样

    今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的.在诸多教程中都会讲到:声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在 ...

  3. Objective-c属性修饰关键字(assign retain copy strong weak)

    一.线程相关: [atomic/nonatomic] (1)atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误.而这种机制是耗费系统资源的,所 ...

  4. 【Kotlin】属性 与 幕后字段 ( 属性声明 | 属性初始化器 | 属性访问器 | field 属性幕后字段 | lateinit 延迟初始化属性 )

    文章目录 I . 属性 字段 总结 II . 属性声明 III . 属性初始化器 IV . get / set 属性访问器 V . 属性幕后字段 field VI . 变量和常量的区别 VII . 延 ...

  5. 在Javascript中 声明时用var与不用var的区别,== 和 ===的区别

    今天,被问到两个JS问题,当时没回答到重点,问题虽然看起来简单,但是细节却马虎不得,在此做下记录: 1. 在Javascript中 声明时用"var"与不用"var&qu ...

  6. Cocos技术派 | TS版各种属性声明详解

    先来看一段代码: cc.Class({extends: cc.Component,properties: {userID: 20,userName: "Foobar"} }); 这 ...

  7. Visual Studio2005的加载此属性页时出错的解决办法(转)

    现象:打开aspx页面时不能切换到设计视图,vs 2005工具箱中无控件.打开vs 2005的工具>选项>HTML设计器时提示:加载此属性页时出错 有时还会有其它错误提示,比如打开一个Wi ...

  8. Tip#66:你知道吗?如何在输入属性值时自动插入双引号

    如果你愿意在HTML Editor中输入属性值时自动加入双引号. 设置选项菜单 Tools->Options. 选 Show all settings. 从左边框中选择 Text Editor ...

  9. [vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗?

    [vue] 在使用计算属性的时,函数名和data数据源中的数据可以同名吗? 莫名其妙的问题.可以同名,但data会覆盖methods.并且本就不该同名,同名说明你命名不规范.然后解释为什么会覆盖,因为 ...

最新文章

  1. CVPR 2022 | 室外多模态3D目标检测(DeepFusion)
  2. SpringCloud成长之路 一 注册与发现(Eureka)
  3. Xamarin 2017.9.13发布更新
  4. 使用Storm实现实时大数据分析!
  5. Windows 令人“社死”的新功能,你都知道吗?
  6. ---------愿 青春与我皆不付---------------------
  7. 华为人均工资高达70万,但先看看华为员工的16 项标准
  8. 期货市场技术分析06_长期图表和商品指数
  9. [tldk][dpdk][dev] TLDK--基于dpdk的用户态协议栈传输层组件简单调研
  10. 物联网芯片的协议之Lora及其调制
  11. 基于EDA技术的频率计系统设计
  12. 收费系统java源代码_java网吧计费系统源代码
  13. windows删除文件时需要管理员权限的方法
  14. 5G词汇通俗解释(5G核心网部分)
  15. 图之深度优先生成森林
  16. 一键修改 PPT 所有页面的字体设置
  17. 前端开发基础知识汇总
  18. 融资融券黑马选股分析系统主力意图大资金流出流入短线涨停板股票炒股软件
  19. 打击标题党,痛斥灌水文
  20. 户外广告 android系统,十目户外广告监测监管系统下载-十目监测(户外广告监测app)v1.0.0 安卓版-腾牛安卓网...

热门文章

  1. 以POST方式下载文件
  2. Ubuntu 18.04 固定ip 设置方法
  3. Linux下LCD 10分钟自动关屏的问题总结
  4. Ubuntu11.04更新源(转)
  5. Docker 多机网络
  6. int 互换 java_Java基础中Int类型变量值互换的几种方法
  7. react怎么存上一页_【React】存储全局数据
  8. php curl 句柄 复用,PHP-curl multi批处理CPU负载过高的解决办法
  9. 问题 F: 小鱼的格子裁剪(dfs)
  10. 云栖大会特享,热营抢先开,阿里云专家的私教课,限时抢报!