内存管理

概述

  • 程序在运行过程中会创建很多的对象,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。

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

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 2,014评论 1 16
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 5,762评论 8 119
  • 29.理解引用计数 Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数...
    Code_Ninja阅读 1,542评论 1 3
  • 内存管理的原理? 内存空间总共有8块区域,有两个区域需要特别注意,一个就是堆空间,一个就是栈空间。栈里存放临时变量...
    Carden阅读 481评论 0 1
  • 流星划过许愿忘掉过往 但它太忙把我心愿遗忘
    万俟遴阅读 154评论 0 0