--NSArray与NSMutableArray用copy修饰还是strong(转)
一、NSMutableArray 被copy、strong修饰后的变化:
把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。
举例如下:
(1)copy:
@property (nonatomic, copy ) NSMutableArray *a;
NSMutableArray* b = [NSMutableArray array];
a = b;
等同于
@property (nonatomic, strong) NSMutableArray *a;
NSMutableArray* b = [NSMutableArray array];
a = [b copy];
a 被copy后就成了NSArray了。
(2)strong:
如果是strong,直接是赋值a = b;右边是什么,左边就是什么,并且是强引用新值,左边的类型会与右边的相同,不会改变。
为了验证以上说法,代码测试之后如下图:
由图可看到,当源对象为可变的时候,最后打印aArray的类型是NSArray,而bArray的类型是NSMutableArray;并且最后在对两个数组分别做删除操作的时候,bArray所在的代码行可以通过,aArray所在的代码行则crash了。
当源对象为不可变的时候,最后得到的aArray和bArray都是不可变的。aArray是不可变的原因是被copy,bArray是不可变的原因是源对象为不可变,与源对象保持一致。并且在对bArray进行删除操作的时候就crash了。
二、NSArray 被copy、strong修饰后的变化:
(1)strong:
被strong修饰之后,由于只是强引用,所以副本对象数组和源对象数组只是指向同一个内存区域,这样就会造成副本对象数组会随着源对象数组的改变而改变,即便有时候你并不想让副本对象跟着改变。
(2)copy:
被copy修饰之后,源对象数组被copy了一份,源对象数组和副本对象数组是不同的,所以副本对象数组并不会随着源对象数组改变。
代码验证如下:
- @property (nonatomic, strong) NSArray *array;
- NSMutableArray *mutableArray = [NSMutableArray array];
- [mutableArray addObject:@"1"];
- self.array = [NSArray array];
- self.array = mutableArray;
- NSLog(@"array---%@",self.array);
- [mutableArray addObject:@"2"];
- NSLog(@"array---%@",self.array);
打印结果如下:由图可知array随着mutableArray变化了。
把array换成copy修饰的之后,打印结果如图:可见这次array并没有随着mutableArray改变。
综上所述:
当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。
--NSArray与NSMutableArray用copy修饰还是strong(转)的更多相关文章
- NSArray和NSMutableArray的copy和MutableCopy
NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...
- 深复制与浅复制&&strong,copy修饰符总结
又是一个老生常谈的话题,可是貌似这个问题,好多ios开发工程师并不能理解透彻,所以简单记录分析一下深复制与浅复制的原理以及strong,copy修饰符的原理和使用. 一.深复制与浅复制 ...
- block要用copy修饰,还是用strong
栈区与堆区 block本身是像对象一样可以retain,和release.但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上.他本身的作于域是属于创建时候的作用 ...
- 如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙,目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 若想令自己所写的对象具有拷贝功能,则需实现 N ...
- NSArray 与 NSMutableArray 的排序
由于集合的使用过程中,经常需要对数组进行排序操作,此博客用于总结对在OC中对数组排序的几种方法 1.当数组中存放的是Foundation框架中提供的对象时,直接使用 compare:方法 如:NSSt ...
- iOS 杂笔-25(不要用copy修饰NSMutableString)
iOS 杂笔-25(不要用copy修饰NSMutableString) 首先对题目进行简单的解释,我所说的不要用copy修饰NSMutableString不是说完全不可以用.但是要清楚一点,既然使用N ...
- NSArray、NSMutableArray和NSMutableDictionary的用法
转自:http://www.cnblogs.com/wangpei/admin/EditPosts.aspx?opt=1 NSArray是静态的数组,就是它所指向的内容是不可改变的,它指向一段内存区域 ...
- iOS之NSString类型为什么要用copy修饰
在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是N ...
- iOS阶段学习第15天笔记(NSArray与NSMutableArray 数组)
iOS学习(OC语言)知识点整理 一.OC中的数组 1)数组:也是一个对象,数组中存放的是对象的地址,可以存放任意类型对象的地址,只能是对象不能是具体的数值,数组是有序的, 可以存放重复的元 ...
随机推荐
- 深入理解PHP之strpos
概述 在php中经常用 strpos 判断字符串是否在另一个字符串中存在, 本文介绍 strpos 函数及其实现. strpos应用 <?php /* strpos示例 */ // test e ...
- 第十五节:Web爬虫之selenium动态渲染爬取
selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...
- led1,1s取反,led2计数10次取反
1 //利用定时器0 1s,led1取反,利用计数器1,跳10,取反 #include<reg52.h> #define uchar unsigned char #define uint ...
- 《AlwaysRun!》第八次团队作业:Alpha冲刺 第一天
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 Always Run! 作业学习目标 (1)掌握软件测试基础技术 (2)学习 ...
- noip模拟赛 轰炸
题目描述 C国和W国爆发了战争!YJC决定对W国的n个城市进行轰炸.每个城市都有一个重要度ai.设xi=‘重要度大于ai的城市数+1’,那么编号为i城市就是第xi个被轰炸的城市.显然这样能保证重要度大 ...
- hdu 4670 树的分治-求点对的个数
/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...
- [河南省队2012] 找第k小的数
★★☆ 输入文件:kth.in 输出文件:kth.out 简单对比时间限制:1 s 内存限制:128 MB 题目描述 看到很短的题目会让人心情愉悦,所以给出一个长度为N的序列A1,A2 ...
- 使用ajax,后台传回的数据处理
使用ajax,后台传到前台的是json数据,但这只是一个字符串的形式,需要进行转换为对象 转换后再使用$.each()方法进行遍历 使用alert(typeof msg) ; 可以查看msg的类型 ...
- ORACLE分区表删除分区数据
--全删除 ALTER TABLE tableName DROP PARTITION partionName UPDATE GLOBAL INDEXES; --清数据 ALTER TABLE tabl ...
- wait、notify应用场景(生产者-消费者模式)
Java实现生产者消费者的方式有:wait && notify.BlockingQueue.Lock && Condition等 wait.notify注意事项:(1) ...