/*
一内存管理
1.
在内存之中申请一块空间用来存储数据,声明一个变量
2.
当数据不在使用的时候,应该将这个数据释放掉
3.
内存中的五大区域栈:作用域结束,也就是大括号结束堆:
BSS:
一旦初始化就会被回收,并转到数据段常量区:程序结束被回收代码段:程序结束被回收
4.
我们创建的对象是存储在堆区的创建在堆区中的对象肯定是需要被回收的,当它不在被使用的时候.就应该被回收掉
iOS
系统对每个APP占用内存是有极限的要求
40M
会给程序发送一条警告
45M
还会再次警告你
120M
直接将程序结束掉
5.
内存管理的范围内存中的除堆区以为的数据都是有系统来自动管理的,所以这些区域的数据不需要程序员管理我们需要管理的是堆区中的数据,也就是OC对象.也就是从NSObject继承的子类对象都需要我们来管理重点:当堆内存中的OC对象不在使用的时候,就应该被释放掉
6.OC
对象的生命周期
1>OC
对象什么时候创建
new,alloc,copy
就会创建一个OC对象.这个时候OC对象就会存储在堆空间中
2>OC
对象什么时候销毁当这个对象不再使用的时候
7.
对象的拥有者谁在使用这个对象,谁就是这个对象的拥有者.
指针指向一个对象,我们就说这个指针在使用这个对象,这个对象的所有者就是这个指针对象什么时候被释放?
当没有任何指针指向这个对象的时候,或者没有任何人在使用这个对象,就应该被释放
8.
对象如何知道有几个人在用我?
Apple
为每个对象设计了一个属性,叫做retainCount引用计数器这个属性占据8个字节,类型unsigned long
1>retainCount
的作用:
用来记录这个对象正在被多少人使用,也可以理解为有多少个指针在指向找个对象当有人使用这个对象的时候,应该让这个对象的引用计数器+1
当有人不再使用这个对象的时候,应该让这个对象的引用计数器-1
2>OC
对象的销毁标准
OC
对象的引用计数器是否为0(不是绝对的)
9.
如何操作对象的引用计数器呢?
为对象发送retain消息,对象的引用计数器就会+1
为对象发送relase消息,对象的引用计数器就会-1
为对象发送retainCount消息.就会得到这个对象的引用计数器的值
所以,当我们要使用这个对象的时候,就应该为对象发送一条retian消息当我们不再使用这个对象的时候,就应该为对象发送一条release消息
10.
对象的销毁在对象销毁的时候,会自动调用对象的dealloc方法一般情况下,我们为了监视对象的销毁我们都会去重写dealloc方法
11.OC
内存管理分类
1>MRC:Manual Reference Counting
手动引用技术,有程序员来记录对象有多少人使用
Xcode4.2
之前,没有ARC的,程序员手动管理内存
2>ARC:Automatic Reference Counting
自动引用计数,由系统自动帮助我们计算
2011
年WWDC,iOS5发布的时候出现ARC
3>
为什么要学习MRC?
a.
面试必问
b.
有些公司的项目开发比较早(2011),使用的是MRC.你要维护
c.
一些公司技术骨干,总监从MRC中成长的.比较看中MRC
认为不会MRC的程序员不是好程序员
d.ARC
是基于MRC的,要学会ARC必须要懂MRC
二MRC开发
1.2011,Xcode4.2
也就是iOS5以后,apple推出ARC机制,所以默认建立的项目都是ARC的
2.
关闭ARC机制
target->all->combined->apple llvm language objective c->objective c automatic reference counting ->
修改为NO
3.
重写dealloc方法的规范
1>
在对象被释放的时候自动调用,做一些对象回收的事情
2>
在子类的dealloc方法中必须要调用父类的dealloc方法.并且要放在最后调用创建子类对象子类对象中有父类的属性,父类的对象属性的release是写在父类的dealloc方法中的,为了能释放子类继承自父类的属性,所以要调用父类的dealloc方法.
这些特别的事情要在父类的dealloc方法中去做所以为了保证对象被正确回收,所在在子类的dealloc方法中要调用父类的dealloc
4.
当对象被创建的时候,这个时候引用计数器默认为1.
注意:给对象发送release消息是让对象的引用计数-1.不是释放对象.
三内存管理的原则
1.
自在有人使用的时候才发retain当一个人不在使用的时候才发release
2.
谁创建,谁release
谁retain,谁release
总结:有始有终,有加就有减
网友评论