美文网首页
内存管理

内存管理

作者: 逆战逆的态度 | 来源:发表于2016-06-20 17:11 被阅读34次

概述

  • 程序在运行过程中会创建很多的对象,oc中的对象都是存储在堆空间中的,系统不会自动释放堆空间中的内存。
  • oc中的基础类型是由系统进行管理的,放在栈空间上。

引用计数

oc中内存管理是依赖对象引用计数器来进行的,oc中每个对象都有一个与之对应的整数,叫引用计数。在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。对象刚被创建时,默认计数器值为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器值自动在原来的基础上加1,当调用这个对象的release方法之后它的引用计数器值减1,如果一个对象的引用计数器值为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。(如果一个对象被释放后,那么最后引用它的变量需要手动设置为nil,否则可能造成野指针错误。)

自动释放池

自动内存释放使用@autoreleasepool关键字声明一个代码块,如果一个对象在初始化时调用了autorelease方法,那么当代码块执行完之后,在块中调用过autorelease方法的对象都会自动调用一次release方法。
1. autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;
2. 自动释放池实质是当自动释放池销毁之后,调用release方法,但是不一定能够销毁对象,例如:当对象引用计数器值大于1时,该对象就无法销毁;
3. 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存,例如:对象较多或者对象占用资源较多,最好不要放到自动释放池或者放到多个自动释放池;
4. OC中类库的类方法一般都不需要手动释放,因为内部已经调用了autorelease方法;

内存管理原则

1. 使用new、alloc、copy方法创建一个对象时,该对象的保留计数器值为1。当不再使用该对象时,应该向该对象发送一条release或autorelease消息。这样该对象在其使用寿命结束时被销毁;
2. 当你获得一个对象时,假设该对象的保留计数器值为1,而且已经被设置为自动释放,那么你不需要执行任何操作来确保该对象得到清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
3. 如果你保留了某个对象,就需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用次数相等。
>:内存管理的黄金法则:谁创建,谁释放。

内存管理的操作

给对象发送消息,进行相应的计数器操作。
Retain消息:使计数器+1,改方法返回对象本身
Release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值

ARC内存管理机制

ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。

  • ARC的判断准则:只要没有强指针指向对象,对象就会被释放。
  • 指针分类:1.强指针 默认情况下,所有的指针都是强指针,关键字strong。2.弱指针 __weak关键字修饰的指针。

ARC的特点总结

(1)不允许调用release,retain,retainCount
(2)不允许重写dealloc,但是不允许调用[
super dealloc]
(3)@property的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础类型)

补充

让程序兼容ARC和非ARC部分。转变为非ARC: -fno-objc-arc ,转变为ARC的: -f-objc-arc 。
ARC也需要考虑循环引用问题:一端使用retain,另一端使用assign。

相关文章

  • 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/uxbwdttx.html