1,内存分配
首先既然我们需要对内存进行管理,就需要知道内存是怎么分配的,是分配在哪里的?
在iOS中数据是存在堆和栈中的,然而我们的内存管理管理的是堆上的内存,栈上的内存并不需要我们管理。
•非OC对象(基础数据类型)存储在栈上
•OC对象存储在堆上
2,内存管理
ios是通过引用计数管理内存的。
当创建一个对象的实例并在堆上申请内存时,对象的引用计数就为1,在其他对象中需要持有这个对象时,就需要把该对象的引用计数加1,需要释放一个对象时,就将该对象的引用计数减1,直至对象的引用计数为0,对象的内存会被立刻释放。
引起引用计数变化的方式:
| 对象操作 | OC中对应的方法 | 引用计数的变化 |
|---|---|---|
| 生成并持有对象 | alloc/new/copy/mutableCopy等 | +1 |
| 持有对象 | retain方法 | +1 |
| 释放对象 | release方法 | -1 |
| 废弃对象 | dealloc方法 | 无 |
管理原则:
1,自己生成的对象,自己持有(alloc、new、copy、mutableCopy)
2,非自己生成的对象,自己也能持有(retain)
3,不再需要自己持有的对象时释放(release,不能重复释放)
4,非自己持有的对象无法释放(崩溃)
注意事项:
1,避免循环引用(声明delegate属性使用weak,声明block使用copy,block中不要使用self,使用 __weak typeof(self) weakSelf = self; )
2,Core Foundation框架生成的C对象需要自己释放内存,通过调用CFRelease释放。












网友评论