美文网首页
iOS 内存管理

iOS 内存管理

作者: Heikki_ | 来源:发表于2018-03-02 16:03 被阅读28次

    ARC 下

    __strong:强引用,持有所指向对象的所有权,无修饰符情况下的默认值.如需强制释放,可置 nil
    __weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置 nil,避免野指针.避免循环引用,会将对象注册到 autoreleasepool
    unsafe_unretained:相当于 assign.直接赋值.引用计数不变

    属性的内存管理

    assign

    直接赋值,一般用来修饰基本数据类型。当然也可以修饰ObjC对象,但是不推荐,因为被assign修饰的对象释放后,指针还是指向释放前的内存,在后续操作中可能会导致内存问题引发崩溃。

    retain

    retain 和 strong 一样,都用老修饰 ObjC对象,使用 set方法赋值时,实质上是先保留新增,再释放旧值,再设置新值,避免新旧值一样时导致对象呗释放的问题.

    copy

    一般用来修饰 String,Dict,Array等需要保护其封装性的对象,尤其是在其内容可变的情况下,因此会拷贝(深拷贝)一份内容跟属性使用,避免可能造成的对元内容进行改动.使用 set方法赋值时,实质上是会先拷贝新值,在释放旧值,再设置新值.实际上,遵守 NSCopying的对象都可以使用 Copy,当然如果你确定要共用同一份可变内容,你也可以使用 strong 或者 retain

    weak

    ARC新引入修饰词,可代替assign,比assign多增加一个特性(置nil)。weak和strong一样用来修饰ObjC对象。使用set方法赋值时,实质上不保留新值,也不释放旧值,只设置新值。

    strong

    ARC新引入修饰词,可代替retain,ARC一般都写strong。

    unsafe_unretained

    等价于assign,可以用来修饰数据类型和OC对象,但是不会使计数器加1,且对象销毁时也不会将对象指向nil,容易造成野指针错误。

    block的内存管理

    如果你使用@property去声明一个block的时候,一般使用copy来进行修饰(当然也可以不写,编译器自动进行copy操作),尽量不要使用retain。
    __weak typeof(self) weakSelf = self;

    相关文章

      网友评论

          本文标题:iOS 内存管理

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