「OC」引用计数(一)

news2024/9/22 20:40:13

iOS学习

  • 前言
  • 自动引用计数
  • 引用计数
    • 引用计数的思考方式
      • 自己生成的对象,自己持有
      • 非自己生成的对象,自己也能持有
      • 不再需要自己持有的对象时释放
      • 无法释放非自己持有的对象
  • 总结

前言

在学习oc时对引用计数略有了解,现在进行系统的学习总结。


自动引用计数

我们先来了解下自动引用计数(ARC)
自动引用计数(ARC,Automatic Reterence Counting)是指内存管理中对引用采取自动计数的技术。(以下摘自苹果官方文档)
新一代 Apple LLVM 编译器中设置 ARC为有效状态,就无需再次键入 retain 或者 release 代码,这在降低程序崩溃、内存泄漏等风险的同时,很大程度上减少了开发程序的工作量。编译器完全清楚目标对象,并能立刻释放那些不再被使用的对象。如此一来,应用程序将具有可预测性,且能流畅运行,速度也将大幅提升。

这是苹果官方给出ARC的优越性,从中也告诉我门开起ARC的三个条件

  1. 使用 Xcode 4.2 或以上版本。
  2. 使用 LLVM 编译器 3.0 或以上版本
  3. 编译器选项中设置 ARC 为有效。

满足这三个条件,就无需在手工输入 retain 和 release 代码

引用计数

下面我们来了解内存管理,即手动引用计数。
我们以房间开灯关灯为例来理解:请添加图片描述
假设办公室里的照明设备只有一个。上班进入办公室的人需要照明,所以要把灯打开。而对于下班离开办公室的人来说,已经不需要照明了,所以要把灯关掉。
但是,如果第一个走的把灯关了,剩下的就无法正常工作了。应该由第一个上班的开灯,最后一个下班的关灯。
即使办公室在还有至少1人的情况下保持开灯状态,而在无人时保持关灯状态。
由此,我们可以得到一个概念“需要照明的人数”,就是引用计数。

在 Objective-C 中,“对象”相当于办公室的照明设备。
“对象的使用环境”相当于上班进入办公室的人。
上班进入办公室的人对办公室照明设备发出的动作,与 Objective-C 中的对应关系:
请添加图片描述
这就是Objective-C中的内存管理:
请添加图片描述

如何理解引用计数这个词呢?

引用计数的思考方式

首先我们来看对象操作对应的OC方法
请添加图片描述
由此,我们从四个方向来思考引用计数

自己生成的对象,自己持有

使用以下名称开头的方法名意味着自己生成的对象只有自己持有:

  • alloc
  • new
  • copy
  • mutableCopy
//自己生成并持有对象
id obj = [[NSObject alloc] init];
id obj = [NSObject new];

除此,还有copy和mutablCopy方法,生成并持有对象的副本。

非自己生成的对象,自己也能持有

我们使用alloc/new/copy/mutableCopy以外的方法取得对象,因为非自己生成并持用,所有自己不是对该对象的持有者。

//非自己生成
id obj = [NSMutableArray array];
//持有该对象。
[obj retain];

不再需要自己持有的对象时释放

自己持有的对象,不再需要时,持有者有义务释放该对象。

//自己生成并持有对象
id obj = [[NSObject alloc] init];
//释放对象
[obj release];

释放对象的方法就是release方法。自己生成而非自己所持用的对象,若使用retain方法变为自己持有,也同样可以用release方法。
对象一旦释放,不可以再访问。

无法释放非自己持有的对象

倘若在应用程序中释放了非自己所持有的对象就会造成崩溃。例如自己生成并持有对象后,在释放完不再需要的对象之后再次释放。或者是取得的对象存在,但自己不持有对象时释放。

情况一:自己生成并持有对象后,在释放完不再需要的对象之后再次释放

id obj = [[NSObject alloc] init];
[obj release];
[obj release];
//释放之后再次释放,应用程序崩溃。

情况二:取得的对象存在,但自己不持有对象时释放

id obj1 = [obj0 object];
//取得的对象存在,但自己不持有对象
[obj1 release];
//释放了非自己持有的对象,导致程序崩溃。

总结

对引用计数初步认识,往后加深学习后再作总结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2155847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣 无重复字符的最长子串

无重复字符的最长子串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/ 题目描述 题目分析 寻找无重复字符子串,首先要求是子串,然后是无重复 子串可以用滑动窗口确定 问题在于如何确定无重复 如果用暴力枚…

Java笔试面试题AI答之设计模式(5)

文章目录 21. 简述Java什么是适配器模式 ?适配器模式的主要组成部分包括:适配器模式的实现方式主要有两种:适配器模式的优点:适配器模式的缺点:示例说明: 22. 请用Java代码实现适配器模式的案例 ? 21. 简述…

01 基础request

目录 类 WxRequest 的定义 静态属性 default 构造函数 constructor 方法 request HTTP 方法封装 创建 WxRequest 实例并导出 完整代码: 类 WxRequest 的定义 创建一个 WxRequest 类包含一个静态属性 default 和几个方法,用于处理网络请求。 静态…

Kotlin编程全攻略:从基础到实战项目的系统学习资料

Kotlin作为一种现代、简洁的编程语言,正逐渐成为Android开发的新宠。本文将为您介绍一套全面的Kotlin学习资料,包括学习大纲、PDF文档、源代码以及配套视频教程,帮助您从Kotlin的基础语法到实战项目开发,系统地提升您的编程技能。…

jetlinks物联网平台学习2(加盐算法登陆)

加盐算法 加盐算法加密验证密码是否正确 对于传统的MD5加密,比更传统的直接保存账号密码稍微安全一点。 md5加密是一种hash算法 比如对于123456来说,md5算法结果一定是e10adc3949ba59abbe56e057f20f883e 这个结果是固定的。于是有的人准备一张彩虹表 预先…

vscode 配置django

创建运行环境 使用pip安装Django:pip install django。 创建一个新的Django项目:django-admin startproject myproject。 打开VSCode,并在项目文件夹中打开终端。 在VSCode中安装Python扩展(如果尚未安装)。 在项…

SpringCloud-07 GateWay01 网关技术

Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Clou…

基于SpringBoot+Vue的高校门禁管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

长亭WAF绕过测试

本文的Bypass WAF 的核心思想在于,一些 WAF 产品处于降低误报考虑,对用户上传文件的内 容不做匹配,直接放行 0、环境 环境:两台服务器,一台配置宝塔面板,一台配置长亭雷池WAF 思路主要围绕:m…

Python | Leetcode Python题解之第423题从英文中重建数字

题目: 题解: class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点: 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境:Vulfocus(官方在线的无法使用,需要自己本地搭建) 官方手册:https://fofapr…

20240922 每日AI必读资讯

OpenAI 首席科学家 MIT演讲! - 揭示 o1模型训练核心秘密: 通过激励模型学习是培养 AGI 系统通用技能的最佳方式。 - 提出了类比“教人钓鱼”的方式,强调激励学习的重要性:“授人以鱼,不如授人以渔”,但是…

机器视觉OpenCV

1. 环境配置 1.1 安装Python https://www.python.org/downloads/windows/ python-3.9.13-amd64 pip下载加速: pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com1.2 安装Ope…

串口RS232,485

RS232和RS485都是串口通信的变种 TTL 串口的波特率/频率:9600,115200等,表示在1s内,串口可以传输9600个高低电平 那串口通信时,高低电压的范围:TTL电平 TTL 的电平标准,理想状态下&#xff0…

通信工程学习:什么是NFV网络功能虚拟化

NFV:网络功能虚拟化 NFV(Network Function Virtualization),即网络功能虚拟化,是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构,将传统的网络硬件设备如路由器、交换机、防火墙、负载…

SOMEIP_ETS_123: SD_Length_of_Entry_Array_longer_than_message_allows

测试目的: 验证DUT能够拒绝一个条目数组长度超出消息总长度的SubscribeEventgroup消息,并以SubscribeEventgroupNAck作为响应。 描述 本测试用例旨在确保DUT遵循SOME/IP协议,当接收到一个条目数组长度超出消息总长度的SubscribeEventgroup…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653:两数之和IV - 输入二叉搜索树 1.1 题目: 给定一个二叉搜索树 root 和一个目标结果 k,如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果,则返回 true。 示例 1: 输入: root [5,3,6,2,4,null,7…

【Python从入门到进阶】65、Pandas如何批量拆分与合并Excel文件

接上篇《64、Pandas如何实现数据的Concat合并》 上一篇我们学习了Pandas如何实现数据的Concat合并,本篇我们来继续学习Pandas如何批量拆分与合并Excel文件。 一、引言 在当今数据驱动的时代,Excel文件作为数据处理和分析的基石,扮演着不可或…

xxl-job使用总结

xxl-job从入门到入土 xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。xxl-job支持调度中心集群和执行器集群。 xxl-job开源项目 xxl-job使用 xxl-job整合SpringBoot 引入xxl-job的依赖 <dependency>…

SpringBoot 3.4.0还没来之前,又又又更新啦!SpringBoot 3.3.4版本依赖升级,性能与稳定性再提升!

为什么要使用SpringBoot在现代开发中&#xff0c;高效与灵活性是每个开发团队追求的核心目标。然而&#xff0c;如何在不牺牲灵活性的前提下&#xff0c;快速构建复杂的应用程序&#xff0c;常常成为开发者的难题。SpringBoot的出现&#xff0c;正是为了解决这个矛盾。它以“约…