Objective-c的内存管理MRC与ARC

2023-05-16

Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求。注意的是Xcode 4.1及其以前版本没有ARC,MRC与ARC的区别如图1所示。需要理解MRC,但实际使用时强推ARC


图1  MRC与ARC区别示意图

 

1. Objective-c语言中的MRC(MannulReference Counting)

 

在MRC的内存管理模式下,与对变量的管理相关的方法有:retain,release和autorelease。retain和release方法操作的是引用记数,当引用记数为零时,便自动释放内存。并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存。

(1)      retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用数加1,即retainCount+= 1;

(2)      release,该方法是释放指针变量对内存数据的所有权,引用数减1,即retainCount-= 1;

(3)      autorelease,该方法是将该对象内存的管理放到autoreleasepool中。

示例代码:

//假设Number为预定义的类

Number* num = [[Number alloc] init];

Number* num2 = [num retain];//此时引用记数+1,现为2

[num2 release]; //num2 释放对内存数据的所有权 引用记数-1,现为1;

[num release];//num释放对内存数据的所有权 引用记数-1,现为0;

[num add:1 and 2];//bug,此时内存已释放。

 

//autoreleasepool 的使用 在MRC管理模式下,我们摒弃以前的用法,NSAutoreleasePool对象的使用,新手段为@autoreleasepool

 

@autoreleasepool {

       Number* num = [[Number alloc] init];

              [numautorelease];//由autoreleasepool来管理其内存的释放

   }

 

对与Objective-c中属性的标识符可以总结为:

@property (nonatomic/atomic,retain/assign/copy, readonly/readwrite) Number* num;

(1)      nonatomic/atomic,表示该属性是否是对多线程安全的,是不是使用线程锁,默认为atomic,

(2)      retain/assign/copy,是有关对该属性的内存管理的,

l   assign"is the default. In the setter that is created by @synthesize, the value willsimply be assigned to the attribute, don’t operate the retain count. Myunderstanding is that "assign" should be used for non-pointer attributes.

l   "retain"is needed when the attribute is a pointer to an object. The setter generated by@synthesize will retain (aka add a retain count) the object. You will need torelease the object when you are finished with it.

l   "copy"is needed when the object is mutable. Use this if you need the value of theobject as it is at this moment, and you don't want that value to reflect anychanges made by other owners of the object. You will need to release the objectwhen you are finished with it because you are retaining the copy.

(3)      readwrite /readonly -"readwrite" is the default. When you @synthesize, both a getter and asetter will be created for you. If you use "readonly", no setter willbe created. Use it for a value you don't want to ever change after the instantiationof the object.

 

 

2. Objective-c语言中的ARC(AutomaticReference Counting)

在ARC中与内存管理有关的标识符,可以分为变量标识符和属性标识符,对于变量默认为__strong,而对于属性默认为unsafe_unretained。也存在autoreleasepool。

 

对于变量的标识符有:

(1) __strong,is the default. An object remains “alive” as long as there is a strong pointerto it.

(2) __weak,specifies a reference that does not keep the referenced object alive. A weakreference is set to nil when there are no strong references to the object.

(3)__unsafe_unretained,specifies a reference that does not keep the referenced object alive and is notset to nil when there are no strong references to the object. If the object itreferences is deallocated, the pointer is left dangling.

(4)__autoreleasing,is used to denote arguments that are passed by reference (id *) and areautoreleased on return,managedby Autoreleasepool.

 

对于变量标识符的用法:

__strong Number* num = [[Number alloc]init];

 

在ARC内存管理模式下,其属性的标识符存在以下几种:

@property (nonatomic/atomic, assign/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默认为unsafe_unretained

 

其中assign/retain/copy与MRC下property的标识符意义相同,strong类似与retain,assign类似于unsafe_unretained,strong/weak/unsafe_unretained与ARC下变量标识符意义相同,只是一个用于属性的标识,一个用于变量的标识(带两个下划短线__)。所列出的其他的标识符与MRC下意义相同。

(1)对于assign,你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。

(2)对于copy,指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。特别适用于NSString,如果你不想改变现有的,就用这个,因为NSMutableString,也是NSString。

 

对于Core Foundation与objective-cObject进行交换时,需要用到的ARC管理机制有:

 

(1) (__bridge_transfer<NSType>) op oralternatively CFBridgingRelease(op) isused to consume a retain-count of a CFTypeRef whiletransferring it over to ARC. This could also be represented by id someObj =(__bridge <NSType>) op; CFRelease(op);

(2) (__bridge_retained<CFType>) op oralternatively CFBridgingRetain(op) isused to hand an NSObject overto CF-land while giving it a +1 retain count. You should handle a CFTypeRefyoucreate this way the same as you would handle a result of CFStringCreateCopy().This could also be represented by CFRetain((__bridge CFType)op); CFTypeRef someTypeRef =(__bridge CFType)op;

(3) __bridge justcasts between pointer-land and Objective-C object-land. If you have noinclination to use the conversions above, use this one.

 

辉辉                                

(FightingBull Studio)               

 

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

Objective-c的内存管理MRC与ARC 的相关文章

  • Python(Web服务)全链路日志个跟踪

    1 背景 在我们的实际项目中 xff0c 尤其以Web服务为例 xff0c 经常遇到要做日志跟踪的场景 我们经常采用的方式是 xff0c 生成一个trace id 在全链路的调用中都输出这个id进行跟踪 这里需要处理的几个问题是 xff1a
  • BCLinux用yum安装报Your license is invalid.

    1 介绍 BCLinux基于 CentOS 进行定制化 xff0c 满足企业对于通用 Linux 操作系统的需求 xff0c 提供标准化 平台化的产品发布及运行环境 xff0c 该版本与红帽商业版本及社区版本完全兼容 2 步骤 安装好操作系
  • Excel表格数据如何批量乘以一个数字

    今天跟大家分享一下Excel表格数据如何批量乘以一个数字 1 打开Excel文件 xff0c 我们想要批量将数字乘以10 2 首先我们选择所有数据单元格区域 3 点击下图选项 xff08 Excel工具箱 xff0c 百度即可了解详细下载安
  • Win2003系统部署SSL证书(部署https教程)

    在windows 2003操作系统下 xff0c IIS 6 环境的服务器SSL证书安装教程 安装前 xff0c 请准备好SSL证书 部署前请退出服务器内安装的杀毒软件 xff08 360 金山 安全狗等安全软件有可能导致SSL证书部署出错
  • Android启动模式之singleinstance的坑

    Android启动模式之singleinstance的坑 前言 在实际应用中 xff0c 使用singleinstance启动模式时 xff0c 会遇到一些奇奇怪怪的问题 Android有四种启动模式 xff0c 分别是standard x
  • 关于使用iconfont图标总生成小长方形框的解决办法

    起因是在联系仿写网易的静态页面的时候 xff0c 使用iconfont小图标的时候 xff0c 引入正确 xff0c 但是在页面上一直显示的是一个长方形小框的页面 各种搜索终于找到了解决办法 主要原因是由于iconfont css中路径不对
  • Qt和MFC的效率对比

    Qt和MFC的效率对比 之前一直做mfc xff0c 昨天看了一晚上的Qt xff0c 瞬间就喜欢上它了 xff0c Qt在windows下应该没有mfc的运行效率高 xff0c 但是我想知道差多少 xff0c 不知有没有大牛做过这方面的对
  • android 移植

    from http wiki kldp org wiki php AndroidPortingOnRealTarget s 6 1 Contents 1 Introduction 2 Copyright and Acknowledgemen
  • LD3320语音识别模块+JQ8900-TF语音模块实现简单的语音交互控制

    玩这个真的要感谢头条的强大推荐 xff0c 清明节回家的大巴车上 xff0c 无聊的刷着头条 xff0c 很智能的给我推荐了一款语音识别模块 xff0c 一直很想自己试着玩一把的我 xff0c 按奈不住 xff0c 点开视频看到了介绍 xf
  • 智能配网方案 Airkiss 技术原理介绍及应用

    写在前面 站在巨人的肩膀上 xff0c 可以看得更远 一 什么是Air Kiss 可以说AirKiss 是微信硬件平台提供的一种WIFI硬件设备快速配置连接网络的技术 xff0c 是一种创新性的信息传递技术 通过该技术可以便捷的向一台具有W
  • 谈谈Android 安全策略SElinux

    不积跬步无以至千里 xff0c 补全自己的短板 xff0c 完善体系 xff0c 站在巨人的肩膀上 xff0c 看到的更远 xff0c 写这篇文章也算是对这个知识点的总结 一 xff0c 背景 SElinux出现之前 xff0c Linux
  • AOSP添加新硬件设备开发-HAL层

    此篇文章接上一篇hidl 我们来实现hal层 hal层官方解释系统硬件抽象层 xff0c 理解为kernel的代理层 xff0c 他的存在屏蔽了不同硬件设备的差异 xff0c 根据提供的访问标准 xff0c 就可以对不同的硬件进行操作 xf
  • 解决 Windows has triggered a breakpoint in Linkage.exe问题

    这两天在做一个小项目 xff0c 里面有多线程的东东 xff0c 在调试的时候 总是遇到 Windows has triggered a breakpoint in Linkage exe 的错误 现在将这个问题和大家分享一下 前提是这样的
  • android rc文件的启动

    记录hostapd 启动方式 xff0c 多种方式可以启动一个bin hostapd android rc init rc fragment for hostapd on Android Copyright c 2002 2016 Joun
  • MTK WLAN支持多种NVRAM方案

    背景 硬件差异的前提 wifi功率会有差异 软件上可以做功率补偿方案 但是需要知道整机状态 然后设定一个flag 软件根据flag 选择使用预制的多NVRAM 简单点来说就是 根据不同条件 加载不同的NVRAM 实现原理 1 根据不同的射频
  • C51矩阵键盘

    对于键盘按键之前也是似懂非懂 xff0c 手里有一块浩豚电子的51板子 xff0c 现在跟着使用说明看一遍学习 矩阵键盘 xff0c 称为行列键盘 xff0c 在单片机上使用4条I O口作为行线 xff0c 4条I O口作为列线 xff0c
  • Ubuntu 获取 root 权限 (临时&永久)

    xfeff xfeff xfeff xfeff Ubuntu 获取 root 权限 操作环境 xff1a Win7 43 VMware Workstation 12 0 1 43 Ubuntu 12 04 1 临时获取 root 权限 xf
  • 广播Boradcast socket sendto出错 errno: 101 Network is unreachable

    关键字 xff1a linux 广播 255 255 255 255 sendto error Network is unreachable 全网广播 场景 xff1a 今天调试linux 网络编程的广播 xff0c 当向255 255 2
  • ubuntu下查看某个包是否已安装

    dpkg l dpkg l grep package name dpkg status package name 查看 var lib dpkg status 内容
  • 查看一个可执行文件或者库的依赖库

    经常需要查看一个可执行文件或者库依赖那些库文件 通常情况下这很好办 xff0c 使用ldd命令就可以了 xff0c 比如 xff1a 1 2 3 4 5 6 ldd bin bash linux vdso so 1 61 gt 0x0000

随机推荐

  • 构建gcc交叉编译工具链

    如何构建一个GCC 交叉编译工具链 GCC不仅是一个编译器 xff0c 它是一个开源工程 xff0c 可以让你建立各种编译器 一些编译器支持多线程 xff0c 一些支持共享库 xff0c 一些支持 Multilib xff08 典型的应用是
  • buildroot VS yocto

    翻译自Buildroot vs OpenEmbedded or Yocto Project A Four Hands Discussion 2016 pdf Buildroot 和 yocto的对比 对比内容 xff1a xff08 1 x
  • git查看各个branch之间的关系图

    提供两种方法 xff1a 1 使用git log命令 git log graph decorate oneline simplify by decoration all 说明 xff1a decorate 标记会让git log显示每个co
  • CUDA入门(一)

    最近我也都在看CUDA xff0c 自己看书和练习也都搞了一个月了 而且经常在CSDN上逛 xff0c 也发现了很多问题 xff0c 所以决定自己写点这方面的东西 xff0c 方便自己也方便后来人 根据我的调查 xff0c 我发现现在的初学
  • Openwrt Package xxx is missing dependencies for the following libraries 问题分析

    Openwrt编译时通常会遇到如下问题 xff1a Openwrt Package xxx is missing dependencies for the following libraries libxxx so 首先检查package
  • shell command命令

    近期遇到一个比较少见的命令command xff0c 详细如下 xff1a command 是一些shell的内建命令 我本机使用的是dash xff0c 服务器使用的是bash xff0c 其他shell没有测试 dash user sp
  • 深入理解Linux内核-第五章笔记

    内核同步 内核同步 内核如何为不同的请求提供服务 内核抢占 同步原语 每CPU变量原子操作优化和内存屏障自旋锁顺序锁读 拷贝 更新RCU信号量完成量禁止本地中断 对内核数据结构的同步访问避免竞争条件的实例 内核如何为不同的请求提供服务 内核
  • 一些截图

  • 基于busybox的bootchart分析

    一 Bootchart简介 Bootchart官网http www bootchart org xff0c 已经很久没有更新了 Bootchart的目的是将启动阶段的性能可视化 xff08 Boot Process Performance
  • 用Android手机spydroid-ipcamera搭载局域网监控环境

    相比有很多人都想用手机实现视频监控吧 xff0c 今天这个教程 xff0c 将会教大家用spydroid ipcamera搭建局域网监控环境 准备工作 xff1a 1 准备一部带有摄像头的 xff0c API level在9以上的手机 xf
  • 3D数学--学习笔记(三):3D中绕任意轴的旋转

    本文转自 xff1a http blog csdn net zjc game coder article details 24269757 不要小看我们在Unity或者3DMAX中的一个简单的旋转物体操作 题记 这里需要用到的知识 xff1
  • Android拼图游戏开发全纪录0

    本文转自 xff1a http blog csdn net eclipsexys article details 18881849 最近刚完成一个Android的小项目 拼图游戏 项目并不复杂 xff0c 但也是一个完整的项目 xff0c
  • Android拼图游戏开发全纪录1

    本文转自 xff1a http blog csdn net eclipsexys article details 18887567 今天我们继续来讲解Android拼图游戏全纪录的第二篇 xff0c 今天要完成的任务比较简单 xff1a 界
  • Android 4.2 SafeVolume机制

    最近一个项目过认证 xff0c 在声压测试时failed 整改方案为 xff1a 在用户将耳机音量提高至安全音量以上时 xff0c 阻止此操作并弹出警告框 xff0c 待用户确认后才提升音量 一开始并不知道android4 2中默认自带了这
  • MarkDown基础语法

    MarkDown基础语法 什么是MarkDown Markdown是一种轻量级标记语言 xff0c 创始人为约翰 格鲁伯 xff08 英语 xff1a John Gruber xff09 允许人们使用易读易写的纯文本格式编写文档 xff0c
  • 命令行查看android手机wi-fi密码

    两招帮你查看wifi密码 xff08 抱歉 xff1a 由于无法传第三张图片 xff0c 第三个图片内容请参照参考网址获得 xff09 第一 xff0c 手机必须root 第二 xff0c 用es文件浏览器或RE管理器进入date misc
  • android网络时间同步总结

    本文转自 xff1a http www cnblogs com hoji real archive 2011 11 14 2247984 html 最近看了下网络时间同步 xff0c 总结一下 整体描述 xff1a android网络时间同
  • win7删除ubuntu系统

    win7 43 ubuntu双系统 xff0c ubuntu开机的时候 xff0c 电脑会响 xff0c ubuntu系统进不去 进入win7系统后 xff0c F盘是通过磁盘管理压缩剩余空间安装ubuntu系统的 xff0c QQ安装在F
  • 手机电池和taskId的寻找

    刷机的时候启动手机时间比较久 xff0c 拔掉电池给手机断电 xff0c 启动的比较快一点 一直这样干 xff0c 一段时间以后 xff0c 手机充电的时候 xff0c 会显示bad battery 提示电池坏掉 电池坏掉后 xff0c 刷
  • Objective-c的内存管理MRC与ARC

    Objective c中提供了两种内存管理机制MRC xff08 MannulReference Counting xff09 和ARC Automatic Reference Counting xff0c 分别提供对内存的手动和自动管理