美文网首页
内存管理

内存管理

作者: _zhw | 来源:发表于2020-04-17 15:01 被阅读0次

iOS内存管理机制的原理是引用计数,简单来说就是统计一块内存的所有权。当有一个对象或指针指向一块内存时,该内存的引用计数就加1(刚被创建出来时是0);如果之后该对象或指针不再指向该内存时,其引用计数就减1。当一块内存的引用计数为0时,系统便会立刻释放掉这块内存。

在开发时引用计数又分为ARC(Automatic Reference Counting)和MRC(Manual Reference Counting)。因为ARC是由系统来管理内存,所以不一定能够及时释放,这样有可能导致程序占用内存较大。若能够熟练使用MRC,则可以保证程序长时间运行在良好状态上。

在MRC中会引起引用计数变化的关键字有:allocretaincopyreleaseautorelease。(strong关键字只用于ARC,作用等于retain
alloc开辟一块新的内存空间,并使这块内存的引用计数从0增加到1,只能由调用
retain使对象的内存的引用计数加1,只能由对象调用
copy复制一个对象到新的内存空间上,旧内存空间的引用计数不会变化,新的内存空间的引用计数从0增加到1,只能由对象调用。copy又分为浅拷贝和深拷贝
浅拷贝:只是拷贝地址与retain等同
深拷贝:拷贝内容,会新开辟内存空间。对于容器类来说,深拷贝不会拷贝容器内元素的内容,只是进行了retain或浅拷贝
release使对象的内存空间的引用计数减1。如果引用计数为0的情况下再调用release,会造成过度释放使内存崩溃。只能由对象调用
autoreleaserelease类似,但不是立刻减1autorelease会在程序走出自动释放池时执行release,如:

@autoreleasepool {
  obj = [[NSObject alloc] init];
  [obj autorelease];
} //当程序走出“}”时,obj的引用计数就会减1

应注意:当一个对象的引用计数变为0占用内存被释放时,会调用-(void)dealloc方法,所以如果在MRC下自定义类,必须在该方法里将该类中属性关键字设置为retaincopy的属性release一次,以免造成内存泄露,重写方法不要忘记在第一行添加[super dealloc];

参考链接:
https://www.jianshu.com/p/d544cd964ced

相关文章

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • 11-AutoreleasePool实现原理上

    我们都知道iOS的内存管理分为手动内存管理(MRC)和自动内存管理(ARC),但是不管是手动内存管理还是自动内存管...

网友评论

      本文标题:内存管理

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