关于内存管理一直是我编程中的软肋。
最近研究了一下,进行深入的剖析一番。
简单讲一下,引用计数。
引用计数是内存管理的一个技巧,它允许多个拥有共同值的对象共享同一个对象。
这种方法简单且高效,
简单是在特定时候增减一下对象的引用计数就可以了。高效是让多个具有相同值的对象共享同一个对象,省却了拷贝赋值的过程,而且更加节省内存和宝贵的CPU时间。
iOS中内存管理是通过自动引用计数来实现的。
总体来说就四点:
1. 自己生成的对象,自己持有。
2. 非自己生成的对象,自己也可以持有。
3.自己持有的对象不再需要时释放。
4. 非自己持有的对象无法释放。
对于持有,就是对对象拥有所有权。当设置__strong 的权限符时,则拥有对象的所有权。当设置__weak的权限符时,则不拥有对象的所有权。
我们在使用的过程中,经常是在属性的设置上用到。
那就分析下iOS对象的几种属性。
retain ( 属性默认是strong,此时的strong指的就是retain), 在赋值时,会增加对象的引用计数。
copy ( 是strong的一种,但与retain不同),原对象的引用计数不变,会开辟新的内存区域,新的对象的引用计数为1.
weak ,没有引用计数的概念。当某个对象被赋给了一个weak的对象,则相当于执行了autorelease 方法。与assign的区别是,在原对象已废弃的情况下,weak会将对象置为nil, 避免了野指针。IBOutlet 可以设置为weak,可能会导致循环引用的变量设置为weak。
assign ,针对基础数据类型, 也没有引用计数的概念。
有个例子可以解释下,strong 和 weak。
http://www.cnblogs.com/mybkn/archive/2012/03/08/2384860.html
http://blog.csdn.net/jevinss/article/details/8473560
retain 和 copy的区别:
retain 是指针拷贝,copy是内容拷贝。
在IOS中,什么时候用Copy?
在OC中有个值对象的概念,当你新定义一个属性是值对象时就应该用copy来修饰。那么什么是值对象呢?
值对象是指封装了基本值(属于C数据类型)且提供与该值相关的服务的对象。Foundation框架提供了以下类(这些类产生对象,用于字符串,二进制数据,日期和时间,数字以及其他值):
NSString和NSMutableString
NSData和NSMutableData
NSDate
NSNumber
NSValue
为什么值对象需要用copy呢?
首先,copy相对于retain更加安全。retain则是原来的存储对象的引用计数加一。如果原来的存储对象被其他对象修改了,则我们获取到的是修改后的值。而copy是在新开辟的内存区域存储对象,将原来的对象的值重新赋到新的对象上。别的对象对原对象的改动,不能影响copy之后的新对象。
其次,copy 分浅拷贝,深拷贝。
顾名思义,浅拷贝,就是创建新对象,对象里的数据仍然是指针复制。
而深拷贝,则是创建新对象,对象里面的数据也是开辟内存,将内容复制过来。一般实现深拷贝,自己需要重写copy方法。
网上有句话描述得很形象:浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
先写到这里,未完待续。。。