OC中ARC机制的理解和整理

2023-05-16

ARC的本质


ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC)。

Automatic Reference Counting (ARC) is a compiler-level feature that simplifies the process of managing object lifetimes (memory management) in Cocoa applications.

ARC只是相对于MRC(Manual Reference Counting或称为非ARC,下文中我们会一直使用MRC来指代非ARC的管理方式)的一次改进,但它和之前的技术本质上没有区别。具体信息可以参考ARC编译器官方文档。

ARC的开启与关闭


不同于XCode4可以在创建工程时选择关闭ARC,XCode5在创建的工程是默认开启ARC,没有可以关闭ARC的选项。

如果需要对特定文件开启或关闭ARC,可以在工程选项中选择Targets -> Compile Phases -> Compile Sources,在里面找到对应文件,添加flag:

  • 打开ARC:-fobjc-arc

  • 关闭ARC:-fno-objc-arc

ARC的修饰符


ARC主要提供了4种修饰符,他们分别是:__strong,__weak,__autoreleasing,__unsafe_unretained。

__strong

表示引用为强引用。对应在定义property时的"strong"。所有对象只有当没有任何一个强引用指向时,才会被释放。

注意:如果在声明引用时不加修饰符,那么引用将默认是强引用。当需要释放强引用指向的对象时,需要将强引用置nil。

__weak

表 示引用为弱引用。对应在定义property时用的"weak"。弱引用不会影响对象的释放,即只要对象没有任何强引用指向,即使有100个弱引用对象指 向也没用,该对象依然会被释放。不过好在,对象在被释放的同时,指向它的弱引用会自动被置nil,这个技术叫zeroing weak pointer。这样有效得防止无效指针、野指针的产生。__weak一般用在delegate关系中防止循环引用或者用来修饰指向由Interface Builder编辑与生成的UI控件。

__autoreleasing

表示在autorelease pool中自动释放对象的引用,和MRC时代autorelease的用法相同。定义property时不能使用这个修饰符,任何一个对象的property都不应该是autorelease型的。

__unsafe_unretained

ARC 是在iOS 5引入的,而这个修饰符主要是为了在ARC刚发布时兼容iOS 4以及版本更低的设备,因为这些版本的设备没有weak pointer system,简单的理解这个系统就是我们上面讲weak时提到的,能够在weak引用指向对象被释放后,把引用值自动设为nil的系统。这个修饰符在定 义property时对应的是"unsafe_unretained",实际可以将它理解为MRC时代的assign:纯粹只是将引用指向对象,没有任何 额外的操作,在指向对象被释放时依然原原本本地指向原来被释放的对象(所在的内存区域)。所以非常不安全。

现在可以完全忽略掉这个修饰符了,因为iOS 4早已退出历史舞台很多年。

栈中指针默认值为nil

无论是被strong,weak还是autoreleasing修饰,声明在栈中的指针默认值都会是nil。所有这类型的指针不用再初始化的时候置nil了。虽然好习惯是最重要的,但是这个特性更加降低了“野指针”出现的可能性。

在ARC中,以下代码会输出null而不是crash:)

1
2
3
4
5
- (void)myMethod 
{
     NSString *name;
     NSLog(@ "name: %@" , name);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OC中ARC机制的理解和整理 的相关文章

  • VirtualBox 如何能捕获/释放鼠标

    xff11 xff0e 热键的选项 xff1a 鼠标集成不选择 xff12 xff0e 当你点击虚拟机的时候会出现下图 xff0c 选择捕获就可以了 xff13 xff0e 但你无法移出到外面主机的时候 xff0c 按住键盘右侧的Ctrl移
  • onNewIntent触发的时机

    前提 ActivityA已经启动过 处于当前应用的Activity堆栈中 当ActivityA的LaunchMode为SingleTop时 xff0c 如果ActivityA在栈顶 且现在要再启动ActivityA xff0c 这时会调用o
  • tomcat各版本下载地址

    https archive apache org dist tomcat
  • Android屏幕尺寸适配常见方案smallestWidth

    前言 介于目前的Android设备存在有不同的屏幕尺寸 xff0c 屏幕分辨率 xff0c 像素密度 xff0c Android应用在开发的过程必须要考虑到屏幕尺寸适配的问题 xff0c 以保证在不同尺寸的Android设备上都能够正常运行
  • 奇数阶魔方阵!

    import java util Scanner public class Test5 打印 魔方阵 所谓的魔方阵是指这样的方阵 xff0c 它的行 列 对角线元素之和均相等 以下是奇数阶魔方阵 xff01 xff01 xff01 xff0
  • 基于Python高光谱遥感影像处理实例

    前言 在写波段配准相关代码时经常需要用到tif影像的波段合成和分解 xff0c 虽然可以用ENVI才处理 xff0c 但是每次都要打开再设置一些参数有些麻烦 xff0c 所以本着 独立自主 自力更生 的原则就写了些脚本来处理这个需求 又写了
  • 基于SIFT的图像Matlab拼接教程

    前言 图像拼接技术 xff0c 将普通图像或视频图像进行无缝拼接 xff0c 得到超宽视角甚至360度的全景图 xff0c 这样就可以用普通数码相机实现场面宏大的景物拍摄 利用计算机进行匹配 xff0c 将多幅具有重叠关系的图像拼合成为一幅
  • PyTorch 进行多步时间序列预测详细教程

    一 前言 Encoder decoder 模型提供了最先进的结果 xff0c 可以对语言翻译等 NLP 任务进行排序 多步时间序列预测也可以视为 seq2seq 任务 xff0c 可以使用编码器 解码器模型 本文提供了一个Encoder d
  • PERSIANN 降雨数据使用教程

    一 前言 PERSIANN xff0c 使用人工神经网络从遥感信息中估算降水 xff0c 是一种基于卫星的降水检索算法 xff0c 可提供近乎实时的降雨信息 该算法使用来自全球地球同步卫星的红外 IR 卫星数据作为降水信息的主要来源 红外图
  • 基于Pyqt5快速构建应用程序详细教程

    一 介绍 图形用户界面 xff0c 更广为人知的名称是 GUI xff0c 是当今大多数个人计算机的一个特征 它为不同计算技能水平的用户提供了直观的体验 尽管 GUI 应用程序可能会使用更多资源 xff0c 但由于其点击式特性 xff0c
  • 基于Python的PROSAIL模型介绍以及使用

    1 介绍 PROSAIL是两种模型耦合得到的 SAIL是冠层尺度的辐射传输模型 xff0c 把冠层假设成是连续的且具有给定几何形状和密度的水平均匀分布的介质层 xff0c 从而模拟入射辐射与均匀介质之间的相互作用 xff0c 具体还是挺复杂

随机推荐

  • 关于VS中LNK1120与errorLNK2019问题

    最近遇到了该问题 xff0c 再查找了一些资料后 xff0c 发现了针对自己问题的解决方法 xff0c 贴出来让大家一起学习一下 其实如果这两个问题同时出现 xff0c 很可能不是链接库缺了lib xff0c 而是编译中添加的源没有被实例化
  • PCL—低层次视觉—点云分割(基于凹凸性)

    转自 xff1a http www cnblogs com ironstark p 5027269 html PCL 低层次视觉 点云分割 xff08 基于凹凸性 xff09 1 图像分割的两条思路 场景分割时机器视觉中的重要任务 xff0
  • 【ENVI入门系列】13.分类后处理

    原文地址 xff1a ENVI入门系列 13 分类后处理 作者 xff1a ENVI IDL中国 版权声明 xff1a 本教程涉及到的数据提供仅练习使用 xff0c 禁止用于商业用途 目录 分类后处理 1 概述 2 分类后处理 2 1 小斑
  • ENVI神经网络工具参数和使用方法

    原文地址 xff1a ENVI神经网络工具参数和使用方法 作者 xff1a pengheligis xff08 1 xff09 Activation xff1a 选择活化函数 对数 xff08 Logistic xff09 和双曲线 xff
  • Android中依赖版本统一管理

    前言 在Android的实际开发中 xff0c 我们会经常使用到多Module开发 xff0c 而当我们修改一些版本信息或者SDK升级时 xff0c 可能涉及多个Module都需要修改 显然逐个修改Module中的build gradle文
  • 详解使用pscp命令Linux文件上传与下载

    一 上传 2 开始 运行 cmd进入到 dos模式输入以下命令 以下是代码片段 xff1a pscp D java apache tomcat 5 5 27 webapps szfdc rardev 64 192 168 68 249 ho
  • 二进制的表白

    没能提起勇气对她进行表白 xff0c 只能寄托于0 1代码记录下对你的喜欢 01000101 01110110 01100101 01101110 00100001 01001001 00100000 01101100 01101111 0
  • java 去除或者替换字符串里面的数字或者字母

    package testPattern import java util regex Matcher import java util regex Pattern public class TestPattern 64 param args
  • python机器学习之scikit安装

    scikit是Python很容易上手的第三方库 下面介绍一下安装过程中遇到的问题 环境是 xff1a win32 43 python27 安装scikit需要安装numpy和scipy 很多教程都会选择使用easy install或者pip
  • 【Windows批处理】交互界面设计

    echo off cls title 终极多功能修复 menu cls color 0A echo span class token keyword echo span span class token operator span span
  • Mac下AndroidStudio报错macMissing essential plugin:org.jetbrains.android Please reinstall Android Studio

    在Mac环境下升级Android studio时报如下错误 xff1a Missing essential plugin org jetbrains android Please reinstall Android Studio from
  • Tensorflow中使用tfrecord方式读取数据

    前言 本博客默认读者对神经网络与Tensorflow有一定了解 xff0c 对其中的一些术语不再做具体解释 并且本博客主要以图片数据为例进行介绍 xff0c 如有错误 xff0c 敬请斧正 使用Tensorflow训练神经网络时 xff0c
  • Newtonsoft.Json解析json字符串处理(最清晰易懂的方法)

    需求 xff1a 假设有如下json字符串 xff1a 34 companyID 34 34 15 34 34 employees 34 34 firstName 34 34 Bill 34 34 lastName 34 34 Gates
  • linux 更改桌面程序图标的方法

    linux 更改桌面程序图标的方法 xff1a 打开个文本编辑器 xff0c 将图标拖到里面 xff1a 其中 xff1a Icon就是图标路径 xff0c 在里面输入你喜欢的图片就行了
  • Android独立Module运行

    前言 Android组件化中我们经常会将逻辑组件到各个Module中 xff0c 为了进一步提高开发效率 xff0c 避免不必要的编译时间浪费 xff0c 我们可以通过对Module中build配置进行进行设置 xff0c 以使各个业务单元
  • 对于人工智能,你有怎样的认识和理解?

    作为最初级的程序员 xff0c 对于高深的技术总是望尘莫及 xff0c 而高大上的人工智能更是让我们感觉遥远 xff0c 不过路都是一步步走出来的 xff0c 只要一直走 xff0c 总有触及到的一天 今天就来聊聊你对于人工智能的认识吧 x
  • 查看linux系统的glibc版本

    查看linux系统的glibc版本 getconf GNU LIBC VERSION span class token comment 或者 span ldd version
  • 嵌入式linux, CAN 驱动有关问题

    与can相关的文件有 1 linux3 0 1源码包中的 drivers net can mcp251x c与Kconfig文件 xff08 将mcp251x c中spi board info 中的 modalias 61 34 mcp25
  • OpenCV自学笔记1:Pycharm + OpenCV3 + Python3 配置记录

    Pycharm 43 OpenCV3 43 Python3 配置记录 引言 xff1a OpenCV 43 Python是开发计算机视觉的利器 xff0c 由于项目的需要 xff0c 最近在Windows系统上配置了OpenCV 43 Py
  • OC中ARC机制的理解和整理

    ARC的本质 ARC是编译器 xff08 时 xff09 特性 xff0c 而不是运行时特性 xff0c 更不是垃圾回收器 GC Automatic Reference Counting ARC is a compiler level fe