栈区:从高到低分配
堆区:从低到高
BSS段:没有初始化的
数据区:
代码段:
OC内存管理方式:
1 MRC 手动内存管理
2 ARC 自动内存管理
nil是给对象赋空值
下个有道云笔记
内存管理
一.总结:
1.只有OC对象才需要内存管理,基本数据类型无效
2.OC对象存放在堆里面
3.非OC对象一般放在栈里面(栈内存会被系统自动回收)
二.引用计数器:
1.每个OC对象都有自己的引用计数器
2.它是一个整数(int)
3.表示有多少人正在使用这个对象
4.每个OC对象都有4个字节的存储空间来存放引用计数器
5.当没有任何人使用这个对象时,即对象的引用计数器为0时候,对象占用的内存就会自动回收
6.任何对象一旦创建好,默认引用计数器就是1
StartFragmentEndFragment
三.引用计数器的常见操作:
1.给对象发送一条retain消息, 可以使引用计数器值+1(retain方法返回对象本身)
StartFragment
2.给对象发送一条release消息, 可以使引用计数器值-1
3.给对象发送retainCount消息, 可以获得当前的引用计数器值(可以通过%ld输出查看)
StartFragment
•注意:我们只能通过操作对象计数器,间接控制对象的释放与否。
四.引用计数器控制
[d retain]; //引用计数器+1
[d release]; //引用计数器-1
[d retainCount];//获得引用计数器的值,返回值是long int
五.引用计数器为0
StartFragment
1.当一个对象的引用计数器值为0时,这个对象即将被销毁,其占用的内存被系统回收,系统会自动给对象发送一条dealloc消息
2.一般会重写dealloc方法, 在这里释放相关资源, dealloc就是对象的遗言
StartFragment EndFragment
3.一旦重写了dealloc方法, 就必须调用[super dealloc],并且放在最后面调用,硬性规定!
StartFragment EndFragment EndFragment
StartFragment EndFragment EndFragment
4.一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为了防止调用出错,可以将“野指针”指向nil(0)。
5,在对象被销毁之后, 将指向对象的指针变为空指针(p=nil)
代码:
- (void) dealloc{
NSLog(@"??死了");
[super dealloc];//这句话必须写,且必须写在最后
}
六.手动内存管理的原则
1.谁创建,谁release
2.retain,谁release
3.只要有人在用,那么这个对象就不会被回收
4.有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1.