iOS的内存管理

关于内存管理一直是我编程中的软肋。

最近研究了一下,进行深入的剖析一番。

简单讲一下,引用计数。

引用计数是内存管理的一个技巧,它允许多个拥有共同值的对象共享同一个对象。

这种方法简单且高效,

简单是在特定时候增减一下对象的引用计数就可以了。高效是让多个具有相同值的对象共享同一个对象,省却了拷贝赋值的过程,而且更加节省内存和宝贵的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方法。

网上有句话描述得很形象:浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。

先写到这里,未完待续。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值