1.内存管理
在内存中申请空间,存储数据.声明1个变量.
当数据不再使用的时候,内存中申请的空间就应该被释放.
2.内存中的五大区域.
栈:存储的是局部变量.局部变量所在的作用域被执行完毕之后.就会被系统立即回收.
堆:程序员手动申请(malloc calloc realloc)的空间。除非程序员手动释放(free)否则直到程序结束的时候才会被释放.
OC对象,new或者alloc的时候OC对象就被创建在堆空间.
OC对象需要被回收吗?什么时候被回收呢?如何回收呢?
BSS段:存储未初始化的静态变量、全局变量.一旦被初始化就从BSS段回收,存储到数据段.
数据段:已经被初始化的静态变量、全局变量.常量数据.程序结束的时候才会被回收.
代码段:存储代码.直到程序结束的时候才会被回收.
3.堆中的OC对象是肯定需要被回收的.
iPhone 512 1GB 2GB
40M警告.
45M警告.
120M闪退.
4.内存管理的范围.
存储在堆中的OC对象不会自动回收.
如果我们创建1个OC对象,这个OC对象的被分配在堆区.
它不会被自动回收.如果我们不管它的话它会在程序结束的时候才会被回收掉.
我们需要管理的是:堆区中的OC对象的释放.
5.堆区的OC对象的回收.
1).什么时候应该回收OC对象.
当OC对象不再使用的时候,或者说没有人使用这个对象的时候这个对象就应该被回收掉.
2).对象的拥有者
谁在使用这个对象,谁就是这个对象的拥有者.
1个指针指向1个对象我们就说这个指针是这个对象的拥有者.这个指针在使用这个对象.
当没有任何指针指向这个对象的时候,就代表这个对象没有任何人在使用它那么这个时候就应该销毁这个对象.
6.引用计数器
每1个OC对象,都有1个属性叫做retainCount类型是unsinged long占据8个字节.叫做引用计数器.
这个属性的作用:用来记录有多少个人正在使用这个对象.
有1个OC对象.
当有1个人使用这个对象的时候,就应该为这个对象的引用计数器+1代表这个对象多了1个人使用.
当少1个人使用这个对象的时候,就应该为这个对象的引用计数器-1代表少1个人使用这个对象.
当对象的引用计数器为0的时候.代表没有人再使用这个对象了,那么这个时候系统就会自动回收这个对象.
在对象被回收的时候,会自动调用这个对象的dealloc方法.
7.操作对象的引用计数器
1).为对象发送1条retain消息.这个对象的引用计数器就会+1
2).为对象发送1条release消息.这个对象的引用计数器就会-1
3).为对象发送1条retainCount消息.就会得到这个对象的引用计数器的值.
当对象的引用计数器的值为0的时候.系统就会立即回收这个对象并执行这个对象的dealloc方法.
8.内存管理的分类.
OC对象的内存管理分为两类.
MRC: Mannul Reference Counting手动引用计数.
程序员手动写代码来改变对象的引用计数器的值.
每当多1个人使用对象的时候手动的为对象发送1条retain消息.
当少1个人使用这个对象的时候手动的为对象发送1条release消息
ARC: Automatic Reference Counting自动引用计数.
Xcode编译器自动的改变对象的引用计数器的值.
当多1个人使用对象的时候,就自动的为对象发送1条retain消息.
少release.
网友评论