NSMutable属性声明时为什么不能使用copy
在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属性时一定要多加注意。
第一次写博客,希望对大家有所帮助,博文中有什么不足的地方希望各位大牛可以帮忙指出,大家一起交流进步
NSMutable属性声明时为什么不能使用copy的更多相关文章
- nsmutablestring 属性声明为copy程序崩溃了
obj.mutableStr = (NSMutableString *)[[NSMutableString alloc] initWithString:@"Hello"]; NSL ...
- iOS: 属性声明strong和retain竟然不一样
今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的.在诸多教程中都会讲到:声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在 ...
- iOS的属性声明:retain和strong的区别
声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在声明Block时,使用strong和retain会有截然不同的效果.strong会等于copy,而r ...
- HTML编码规则、CSS属性声明顺序--简介
From AmazeUI:http://amazeui.org/getting-started/html-css-guide HTML 属性顺序 HTML 属性应当按照以下给出的顺序依次排列,确保代码 ...
- 在Javascript中 声明时用"var"与不用"var"的区别,== 和 ===的区别
今天,被问到两个JS问题,当时没回答到重点,问题虽然看起来简单,但是细节却马虎不得,在此做下记录: 1. 在Javascript中 声明时用"var"与不用"var&qu ...
- Visual Studio《加载此属性页时出错》的解决办法
打开aspx页面时不能切换到设计视图,vs 2008工具箱中无控件.打开vs 2008的工具>选项>HTML设计器时提示:加载此属性页时出错 有时还会有其它错误提示,比如打开一个Windo ...
- 属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter
属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter 一.普通的get 和set 属性. 一般的get 和set 属 ...
- iOS:不同属性声明方式的解析
代码: /* 属性声明方式说明: ----------------------- 1 @interface ... { id name } @end 这样声明的属性其实可以认为是private属性,因 ...
- <jsp:param>标签给属性赋值时的一个坑
http://blog.sina.cn/dpool/blog/s/blog_58c5066001011gdn.html 因为: <jsp:forward和<jsp:param在被编译成ja ...
随机推荐
- 微信客户端+微信公众平台+新浪云SAE+Arduino+WS100(控制LED)
第一步:准备 1.智能手机微信客户端或微信电脑版 2.注册微信公众平台 https://mp.weixin.qq.com 3.注册新浪账号 http://www.sinacloud.com 4.拥有一 ...
- Classy(排序)
Description In his memoir So, Anyway. . ., comedian John Cleese writes of the class di erence betwee ...
- jquery.imagezoom.js制作鼠标悬停图片放大镜特效、参数和最简教程
一.插件介绍 今天在用到放大镜效果的时候,突然发现网站里没有放大镜的插件.于是总结了一下,放到这里.为自己,也为他人提供方便.jquery.imagezoom.js这款插件用途很简单,就是鼠标移过去, ...
- Spring+SpringMVC+MyBatis+easyUI整合
进阶篇 Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API 优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第八节--ABP错误机制及AbpSession相关
上一节我们讲到登录逻辑,我做的登录逻辑很简单的,我们来看一下abp module-zero里面的登录代码. #region Login / Logout public ActionResult Log ...
- appach-maven-3.5.0配置与下载
今天需要搭建javaweb开发的环境,需要配置maven.弄了半天终于配置好了.蛋疼的一批.楼主用的是win10的系统.不知道Linux下的也是不是这么坑! 首先,需要把maven的包下载下来.进入h ...
- 放开那个UI 妹子,让我来(上)
一.前言 今天要学习的内容:今天主要是稍微总结一下,页面中如何用字体代替图片,省事,省时,方便,实用! 小苏啰嗦:人都是有惰性的.真的.刚开始我们有一个经验丰富的美工,加上我们关系又非常好,以至于每次 ...
- 玩转JS系列之代码加载篇
从前我们这样写js <script type="text/javascript"> function a(){ console.log('a init');}funct ...
- Vue多元素过渡
前面的话 前面分别介绍了单元素过渡的CSS过渡和JS过渡,本文将详细介绍Vue多元素过渡 常见示例 最常见的多标签过渡是一个列表和描述这个列表为空消息的元素: <transition> & ...
- 谷歌。百度,阿里云,机器翻译简单PK。
原文:Google 的免费翻译服务可提供简体中文和另外 100 多种语言之间的互译功能,可让您即时翻译字词.短语和网页内容. 阿里云:google's free translation service ...