ios内存管理记录

ios的内存管理技术是自动引用计数也就是(Automatic Reference Counting,自动引用计数,简称ARC)。在object_c内存管理中每个对象都有自己的引用计数器,创建一个对象,应用计数+1,如果想让对象继续存活,就递增它的应用计数,如果不再使用它,就递减它的应用计数。如果对象不再被使用之后,引用计数就记为0,系统就会销毁这个对象。

引用计数有着及时的回收垃圾,相对于其它的内存管理GC技术查找次数少的优点,让我们感觉到了ios的流畅性。不过这种技术是怎么出现的呢?为什么要这样设计。
这就要回到以前开发者们那段阴影回忆,ios的手动管理引用计数的也就是MRC(manual retain-release),MRC。当时开发情形自形脑补,哈哈~

对联.png

程序员手动添加retain来使引用计数+1,release 使引用计数-1.但一般遵循下面几个原则。

  • 开头为alloc,new,copy,mutableCopy的方法创建的对象,引用计数都会被+1;
  • 如果需要对对象进行引用,可以通过retain来使引用计数+1;
  • 不再使用该对象时候,通过release使应用计数-1;
  • 不要release你没有持有的对象。

在ARC时代,我们就不需要手动Retain,Release了。ARC是MRC的升级版,让NSObject类本身肩负了内存管理的职责,alloc是NSObject类的类方法,retain、release、dealloc是NSObject类的实例方法。以及引用了一些修饰符strong,weak,__strong,__weak,__unsafe_reatian等等。如使用weak,__weak关键字可以有效的避免野指针的问题。

weak

weak是ARC中新增加的属性修饰符,主要定义一种“非拥有关系”,使用weak修饰的属性的setter方法会既不保留新值,也不释放旧值,不会使属性指的对象的引用计数增加,当指向的对象被释放时,属性值也会被自动置为nil。

strong

strong是ARC中新增加的属性修饰符,跟MRC时代中的retain修饰符很像,描述一种“拥有关系”,使用strong修饰的属性的setter方法会先保留新值,再释放旧值,最后把新值设置上。

unsafe_unretained

unsafe_unretained与assign类似,但是用于对象类型,从字面意思上,也能看到,它是不安全,也不会强引用对象,所以它跟weak很相似,跟weak的区别在于当指向的对象被释放时,属性不会被置为nil,所以是不安全的。

但在ARC下也有些规则是我们要考虑的如:

  • 不能使用retain/release/retainCount/autorelease。
  • 不能使用NSAllocateObject/NSDeallocateObject。
  • 必须遵守内存管理的命名规则。
  • 不能显示的调用dealloc,比如[super dealloc]。
  • 用@autorelease代替NSAutoreleasePool。
  • 不能使用NSZone。
  • 对象类型变量不能作为C语言结构体成员(可以用__unsafe_unretain修饰之后使用)
  • 不能显示转换id和void*(可以通过_bridge,_bridge_retained,__bridge_transfer)。

objc对象ARC自动帮我们管理了,但非objc对象还是要自己管理。从ARC来管理内存的角度看,无非是这一系列操作生成并持有(alloc/new/copy/mutableCopy)、持有(retain)、释放(release)、废弃(dealloc)
先记录到这……
后面会从runtime源码来看retain ,release,dealloc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,104评论 1 16
  • 概述 在iOS中开发中,我们或多或少都听说过内存管理。iOS的内存管理一般指的是OC对象的内存管理,因为OC对象分...
    DamonMok阅读 9,469评论 2 20
  • Cocoa内存管理机制 (1)当你使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1.当...
    John_LS阅读 7,767评论 0 6
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,909评论 1 32
  • “那个男人已经在这一天了”,晓婷凑近我的耳朵说。晓婷是我酒吧里的服务员,在附近一个大学读书,课余时间在我这打工。 ...
    半岛铁人阅读 4,436评论 4 47

友情链接更多精彩内容