内存管理

概述

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

你可能感兴趣的:(内存管理)