OC内存管理

来源:互联网 发布:马尔科夫概率转移矩阵 编辑:程序博客网 时间:2024/06/16 07:46
【MRC】(Manual Reference Counting):手动内存管理
【ARC】(Automatic Reference Counting):自动内存管理

工程切换内存管理模式:左边栏选择工程—>搜gar—>yes/no

一、手动内存管理
        1、为什么要进行内存管理
                堆空间才需要内存管理,程序员手动申请,手动释放。忘记释放,内存泄露(leak);提前释放和过多释放会导致内存崩溃。OC的绝大部分对象都在堆空间,我们必须要进行内存管理。解决:1、内存泄露(忘记释放);2、内存崩溃(提前/过早释放、多释放)
        2、内存管理原理:
                计数器加1或者减1:多一个指针指向堆空间计数器就加1(retain),用完一个指针,计数器就减1(release)
        3、内存管理黄金法则:
                当我们程序员自己凡是使用alloc/retain/new/copy/mutablecopy这些方法把对象地址给了一个指针变量,当这个指针变量用完之后,就需要使用release/autorelease释放,释放后的指针就不要再操作原来的对象了。
                各人顾各人的原则:每个指针只需要管理好自己就可以了,不需要管理其他的指针。
                凡是使用了alloc/retain/new/copy/mutablecopy,就需要release,使用一次凡是中规定的方法,就需要一次release,没有用凡是中规定的方法,就不需要release。
            4、new、copy、mutablecopy涉及到深浅拷贝
            5、init:在init方法中如果使用了alloc/retain/new/copy/mutablecopy,则需要使用release释放,这个release一般放在dealloc方法中
            6、setter:
        //手动内存管理时setter方法标准写法,面试经常会提问
        -(void)setEngine:(Engine *)newEngine {
            if(_engine != newEngine) {//首先判断是否为同一对象
                [_engine release];//先release旧对象
                _engine = [newEngine retain];//再用retain赋新值,保留计数加1
            }
        }
    
        7、property自动生成setter、getter方法时:
        限定词为retain/copy:生成的setter和getter方法中要考虑内存管理,setter方法中会使用retain/copy,所以要在dealloc中加上release。如果property属性修饰符用在ARC中,还可以写成strong和weak等价于retain和assign。
        8、autoreleasepool:{}大括号结束的时候,自动释放池销毁,销毁的时候会给池子中的所有对象发送release。
        1)一个程序中,可以有多个自动释放池
        2)自动释放池就像一个垃圾回收中心,专门管理一些对象,这些对象在自动释放池中就像一个链表结构或者一个可变数组
        3)在iOS中的各种事件触发方法一般都会自动添加自动释放池
        4)iOS的生命周期方法也会自动添加自动释放池
    autorelease一般用的很少,一般能用release的地方就用release,在万不得已的时候才用autorelease,把对象放入自动释放池
        
            9、数组的内存管理:数组内部对新加的元素都进行了retain,引用计数加1了,但是不需要我们管理
            
            10、单例:一个类在整个程序中只会创建一个对象,这个对象的数据在整个程序中是共享的,类似于全局变量。类的单例方法命名一般用shared+类名或者用default+类名,单例方法中创建的对象不需要释放。






0 0
原创粉丝点击