iOS进阶练习

内存管理

2018-10-22  本文已影响7人  下页天

简介

引用计数

栈里面存放的是值类型,堆里面存放的是对象类型。对象的引用计数是在堆内存中操作的

引用计数简介

引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。由于引用计数简单有效,除了 Objective-C 和 Swift 语言外,微软的 COM(Component Object Model )、C++11(C++11 提供了基于引用计数的智能指针 share_prt)等语言也提供了基于引用计数的内存管理方式。

启动手工管理引用计数模式。 -fno-objc-arc
使用ARC 默认 -fobjc-arc

ARC指的是编译器在编译时会帮我们自动插入,包括 retain、release、copy、autorelease、autoreleasepool

引用计数的这种管理方式类似于文件系统里面的硬链接。在 Linux 文件系统中,我们用 ln 命令可以创建一个硬链接(相当于我们这里的 retain),当删除一个文件时(相当于我们这里的 release),系统调用会检查文件的 link count 值,如果大于 1,则不会回收文件所占用的磁盘区域。直到最后一次删除前,系统发现 link count 值为 1,则系统才会执行直正的删除操作,把文件所占用的磁盘区域标记成未用。

为什么需要引用计数

问题:对象 A 生成了一个对象 M,将对象 M 作为参数传递给对象B。

ARC自动管理计数

所有权修饰符

Objective-C编程中为了处理对象,可将变量类型定义为id类型或各种对象类型。 ARC中,id类型和对象类其类型必须附加所有权修饰符。

__strong修饰符

__weak修饰符

__unsafe_unretained修饰符

__autoreleasing修饰符

ARC规则

在ARC有效的情况下编译源代码,必须遵守一定的规则。

ARC内存的泄露和检测

上一篇 下一篇

猜你喜欢

热点阅读