@property内存管理策略的选择
1.非ARC
1> copy : 只用于NSString\block
2> retain : 除NSString\block以外的OC对象
3> assign : 基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用
retain,一端用assign
2.ARC
1> copy : 只用于NSString\block
2> strong : 除NSString\block以外的OC对象
3> weak : 当2个对象相互引用,一端用strong,一端用weak 4> assgin : 基本数据类型、枚举、结构体(非OC对象)
***************************************************
集合内存管理总结
1.官方内存管理原则
1> 当调用alloc、new、copy(mutableCopy)方法产生一个新对象的时候,就必须在最后调用一次release或者autorelease
2> 当调用retain方法让对象的计数器+1,就必须在最后调用一次release或者autorelease
2.集合的内存管理细节
1> 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1
2> 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1 3> 当一个对象从集合中移除时,这个对象会一次release操作,计数器会-1
3.普遍规律
1> 如果方法名是add\insert开头,那么被添加的对象,计数器会+1 2> 如果方法名是remove\delete开头,那么被移除的对象,计数器-1
*******************************************************
对象copy的概念
1)什么是copy
Copy的字面意思是“复制”、“拷贝”,是一个产生副本的过程 对象拷贝的目的:要使用某个对象的数据,但是在修改对象的时候不影响原来的对象内容。 常见的复制有用一个源文件产生:文件复制
作用:利一个副本文件
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; @end
mutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
*******************************************************************
copy快速入门
以NSString 字符串为例,进行copy 和 mutableCopy 演示
copy 就是浅复制,因为没有产生新的对象(有没有产生新的对象也是判断深浅复制的标准) 此处的copy 后产生还是不可变的字符,mutableCopy 就是深复制,会再内存中重新分配一块内存空间
copy与内存管理
深复制(深拷贝,内容拷贝,deep copy) 源对象和副本对象是不同的两个对象
源对象引用计数器不变, 副本对象计数器为1(因为是新产生的) 本质是:产生了新的对象
浅复制(浅拷贝,指针拷贝,shallow copy) 源对象和副本对象是同一个对象 源对象(副本对象)引用计数器 + 1, 相当于做一次retain操作 本质是:没有产生新的对象