iOS 内存管理

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;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Copyright © 2017年ZaneWangWang. All rights reserved. 如果你看到...
    2897275c8a00阅读 932评论 0 1
  • 机制 OC采用引用计数器对内存进行管理,当一个对象的引用计数(retainCount)为0,则被释放。 引用计数分...
    806349745123阅读 12,709评论 2 16
  • 貌似每个iOS开发者都有一篇属于自己的内存管理,记录了自己对内存管理理解的深度以及广度,所以我也来记录一下我的理解...
    Bugfix阅读 2,278评论 0 3
  • 转自iOS经典面试题总结--内存管理 - CocoaChina_让移动开发更简单 内存管理 1.什么是ARC? A...
    赤洱阅读 235评论 0 0
  • 周末,暴雨。 周六带着低烧跑到很远的郊区参加考试,嗯,裸考,提前一个小时交卷,最近人品都不行,估计是做分母了。暴雨...
    赵奕筱阅读 432评论 0 1