集合对象的内存管理、copy概念
来源:互联网 发布:mac如何还原网络设置 编辑:程序博客网 时间:2024/04/28 09:01
一、集合对象
1、集合包括 NSArray ,NSSet , NSDrictionary
2、内存管理
当一个对象加入到集合中,那么该对象的引用计数会+1 当集合被销毁的时候,集合会向集合中的元素发送release消息
3、内存管理原则
1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease2.集合的内存管理细节1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+12> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1 3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-13.普遍规律1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1 2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
二、对象copy
1、基本概念
1)什么是copyCopy的字面意思是“复制”、“拷贝”,是一个产生副本的过程 对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容。 常见的复制有用一个源文件产生:文件复制作用:利一个副本文件2)特点:修改源文件的内容,不会影响副本文件 修改副本文件的内容,不会影响源文件 OC中的copy,就是指的对象的拷贝 作用:利用一个源对象产生一个副本对象 修改源对象的属性和行为,不会影响副本对象 修改副本对象的属性和行为,不会影响源对象3)如何使用copy功能一个对象可以调用copy或mutableCopy方法来创建一个副本对象copy : 创建的是不可变副本(如NSString、NSArray、NSDictionary)mutableCopy :创建的是可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)4)使用copy功能的前提copy : 需要遵守NSCopying协议,实现copyWithZone:方法 @protocol NSCopying- (id)copyWithZone:(NSZone *)zone; @endmutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法@protocol NSMutableCopying- (id)mutableCopyWithZone:(NSZone *)zone; @end
2、copy快速入门
2.1 、copy 就是浅复制,因为没有产生新的对象(有没有产生新的对象也是判断深浅复制的标准) 此处的copy 后产生还是不可变的字符串。
3、copy与内存管理
NSString的copy ,浅复制, 源对象的引用计数器+1
NSString的mutableCopy 深复制, 创建了一个新对象,新对象的引用计数器是1
深复制(深拷贝,内容拷贝,deep copy) 源对象和副本对象是不同的两个对象源对象引用计数器不变, 副本对象计数器为1(因为是新产生的) 本质是:产生了新的对象浅复制(浅拷贝,指针拷贝,shallow copy) 源对象和副本对象是同一个对象 源对象(副本对象)引用计数器 + 1, 相当于做一次retain操作 本质是:没有产生新的对象
4、@property内存管理策略选择
1.非ARC1> copy : 只用于NSString\block2> retain : 除NSString\block以外的OC对象3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端用assign2.ARC1> copy : 只用于NSString\block2> strong : 除NSString\block以外的OC对象3> weak : 当2个对象相互引用,一端用strong,一端用weak 4> assgin : 基本数据类型、枚举、结构体(非OC对象)
5、自定义的类实现copy操作
1、为自定义类实现copy操作自定义对象copy步骤新建Person类 为Person类实现copy操作1.让Person类遵守NSCopying协议2.实现 copyWithZone: 方法, 在该方法中返回一个对象的副本即可。3. 在copyWithZone方法中, 创建一个新的对象,并设置该对象的数据与现有对象一致, 并返回该对象.创建Person对象, 调用copy方法, 查看地址。细节介绍:1. 调用copy其实就是调用copyWithZone方法,所以要实现copyWithZone方法。(查看 NSObject协议中的copy方法的介绍)2. copyWithZone方法返回值类型是id类型, 需要返回一个对象的副本。3. 关于copyWithZone的参数zone问题:* zone: 表示空间,分配对象是需要内存空间的,如果指定了zone,就可以指定 新建对象对应的内存空间。但是:zone是一个非常古老的技术,为了避免在堆中出现 内存碎片而使用的。在今天的开发中,zone几乎可以忽略* 查看NSObject协议中的allocWithZone:方法介绍(zone参数可以被忽略,是历史 原因)4.如果对象没有 可变/不可变 的版本区别,只要实现 copyWithZone 方法即可. 5. copyWithZone:方法的具体实现:- (id)copyWithZone:(NSZone *)zone{//创建对象Person *p1 = [[Person alloc] init]; //用当前对象值给新对象的实例变量赋值 p1.age = self.age;//返回新对象return p1;}为Person类实现mutableCopy操作 1.遵守NSMutableCopying协议2.实现协议对你的方法- (id)mutableCopyWithZone:(NSZone *)zone{//创建对象Person *p1 = [[Person alloc] init]; //用当前对象值给新对象的实例变量赋值 p1.age = self.age;//返回新对象return p1;}
0 0
- 集合对象的内存管理、copy概念
- iOS 内存管理~非集合对象的copy和mutableCopy
- iOS 内存管理~集合对象的copy和mutableCopy
- OutMan——集合对象的内存管理、copy的介绍及使用
- Objective-C Copy的概念、入门和内存管理
- Objective-C 集合对象的内存管理
- iOS集合对象的内存管理
- 133,集合中对象的内存管理
- oc加强day5-NSFileManger、NSPoint与CGPoint等简单结构体、简单数据类型的封装、集合对象的内存管理、copy、单列模式
- 内存管理的概念
- 集合的内存管理
- 集合的内存管理
- Foundation框架-08 集合对象的内存管理
- 1.内存管理的概念
- Objective-C 【集合对象内存管理】
- copy内存管理...
- copy内存管理(二)
- 对象的内存管理
- 数据库性能优化二:数据库表优化
- 延续性动词与非延续性动词及其转换
- Linq基础(一)
- 数据库性能优化三:程序操作优化
- jdk6版本下载地址
- 集合对象的内存管理、copy概念
- 如何在cocos2dx中使用Lua创建自定义
- 深圳地铁远期规划20条线路图首发
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(四)
- 几种排序算法
- UIScrollView滚动视图属性及方法介绍
- 网上销售平台--项目简介(一)
- top 内存耗用:VSS/RSS/PSS/USS
- 数组之冒泡排序法--从小到大