美文网首页
内存管理机制

内存管理机制

作者: Leon_Jiang | 来源:发表于2018-04-08 15:20 被阅读0次

    retain : release旧值 , retain新值。

    assign : 直接赋值

    copy :release旧值 , copy 新值。 

    release旧值 , retain新值其实就是在set方法里面实现如下代码

    - (void)setCar:(Car *)car{

        if ( car != _car )

        {

            [_car release];

            _car = [car retain];

        }

    }

    OC使用了一种叫做引用计数的机制来管理对象

    引用计数(reference counting)又称为保留计数(retaincounting),引用计数的数值表示有几个其它对象在使用它。

    retain(MRC)

    retain创建新对象(新对象引用计数+1),然后指向新对象。

    retain用法为先判断此新对象是否存在,如果存在先release,然后retain。如果不存在直接retain。

    一般用于指针对象,例如数组对象(NSMutableArray,NSArray),字典对象,视图对象(UIView),控制器对象(UIViewController)等这些需要保持引用计数的属性。

    assign(ARC、MRC)

    不复制,不保留就是直接赋值的意思。常修饰基本数据类型(int,float)、枚举、结构体。如果没有使用weak,strong,retain,copy修饰,那么默认就要使用assign修饰(不能共存)。对象也可以使用assign修饰,但修饰对象的引用计数不会+1(与strong的区别再此)。如果用来修饰对象的属性,那么当前所修饰的对象被销毁后指针不会指向nil的。所以会出现野指针错误(与weak区别再此)。

    copy(ARC、MRC)

    在MRC中,先release旧对象(旧对象引用计数-1),再copy新对象(新对象引用计数+1),指向新对象(这样做是为了减少上下文的依赖而引入的一种机制)。新对象是指最终指向的那个对象(包含深拷贝、浅拷贝)。

    在ARC中,直接copy新对象,新对象引用计数+1,然后指向新对象。

    注意:copy修饰的对象,本身是不可变的。否则添加元素表面上可以,但运行时会奔溃。

    release(MRC)

    旧对象,旧对象引用计数-1

    autorelease(MRC)

    自动释放池(Autorelease pool),是能够自动释放赤忠的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。

    自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。autorelease只不过意味着预定延迟发送一条release信息,当前的引用计数并没有变。

    atomic(ARC、MRC)

    原子属性就是生成的set方法互斥锁@synchronize(锁对象),需要消耗系统资源。

    互斥锁是利用线程同步实现的,意在保证同一时间只有一个线程调用set方法。只针对set方法,同时也有get方法。

    nonatomic(ARC、MRC)

    不对set方法加锁,性能好,线程不安全。

    readonly(只读)(ARC、MRC)

    让Xcode只生成get方法,不想把暴露的属性被人随便替换时,可以使用。

    readwrite(可读可写,默认属性)(ARC、MRC)

    让Xcode生成get/set方法,不用readonly修饰时,默认就是readwrite修饰。

    strong(ARC、强引用)

    指针修饰会保存对象的生命,某些情况下你仍然需要手动设置这些指针为nil,否则可能会导致内存不足。无论何时你创建一个新对象时,都需要考虑谁拥有该对象,以及这个对象需要存活多久(ARC之后引入strong代替了retain)。常修饰OC对象,默认修饰符也是strong,引用计数+1。

    weak(ARC、弱引用)

    指针变量仍然可以指向一个对象,但不属于对象的拥有者。weak型的指针变量自动变为nil是非常方便的,这样阻止了week指针继续指向已释放对象,避免了野指针的产生,不然会导致非常难于寻找的Bug,空指针消除了类似的问题。常修饰代理/UI控件,不能修饰基本数据类型:因为weak是弱指针,弱指针是针对对象的修饰词.weak修饰引用计数不会+1,也就是直接赋值,弱引用是打破循环引用而产生的。

    ARC机制的使用规则

    1)、不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease。dealloc虽然能够重写,但是不能调用[super dealloc]之类的方法。

    2)、不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象。

    3)、不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体。

    4)、不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool更高效。

    5)、不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

    6)、不得对一个属性变量的取值方法命名以new开头。

    7)、outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

    8)、CoreFoundation不适合ARC,该创建的仍创建,该释放的仍释放。

    相关文章

      网友评论

          本文标题:内存管理机制

          本文链接:https://www.haomeiwen.com/subject/jrpphftx.html