OC中的MRC内存管理方式

2023-05-16


MRC内存管理:Manual Reference Counting

一、人工引用计数:

内存的开辟和释放都由程序代码进⾏行控制。相对垃圾回收来说,对内存的控制更加灵活,可以在需要释放的时候及时释放,对程序员的要求较⾼高,程序员要熟悉内存管理的机制。 

1、MRC的内存管理机制是:引用计数

2、让引用计数由0~1的方法:alloc、copy

3、让引用计数+1的方法是:retain

4、让引用计数-1的方法是:release、autorelease

5、让引用计数由1~0的方法:dealloc

6、得到内存的引用计数:object.retainCount

※注意:

①、引用计数是保存在内存中,不属于某个指针

②、每当你为一个对象开辟了空间(alloc,copy)或让引用计数+1(retain),使用完后,必须将引用计数-1(release),release必须与alloc、copy 一一对应!

③、当引用计数为1时,再使用release方法的时候,理论上是将引用计数由1~0的,但是实际上是不会的,因为xCode环境下会自动调用dealloc方法将内存释放。

④、若你多次访问已经释放的空间会出现两种情况:能够正常访问或者程序崩溃

⑤、若过度释放,程序一定会崩溃

⑥、当对象释放后,为防止过度释放和访问不存在的空间,可以将对象设置为nli,因为给空对象发送消息,不会引起程序崩溃

⑦、谁使用了alloc、retain、copy就由谁释放

特例:NSString和NSNumber创建出来的引用计数都是”-1”,凡是字面量创建出来的对象都会去到常量区里

7、自动释放池

@autoreleasepool {}

①、autorelease方法的使用必须要在自动释放池里使用,在自动释放池外使用,不见效

②、在自动释放池内部调用的autorelease,会在自动释放池释放时,释放对应对象

③、自动释放池,在右大括号处释放 自己

⑤、利用autorelease释放时,过度释放,会崩溃在自动释放池的右大括号处

二、协议

1、协议是一系列方法的集合,对于协议本身是不需要方法的实现

2、创建协议:OS X选项中的Objective - C File

3、协议只有声明,没有实现,所以也没有.m文件

4、它以@protocol开头,以@end结束

5、不可以在协议内写实例变量,只能写方法

6、协议中的方法分别为两类:

①、必须实现的方法:@required

②、可选实现的方法:@optional

7、若让类遵守协议,必须先应用相对应的协议文件#import 

8、协议在父类名称后面用<>写起来,一个类可以遵守多个协议,多个协议之间用逗号隔开

9、协议方法实现写在类的.m文件中,无需在.h中声明


三、有关copy的伪拷贝、浅拷贝、深拷贝

1、伪拷贝:只拷贝对象的地址,源对象和新对象指的是同一个对象




2、浅拷贝:创建新的对象空间,拷贝属性空间地址,拷贝属性地址,对象不同,但两者属性空间公用一块内存空间


3、深拷贝:创建新的对象空间,创建新的属性空间,拷贝属性内容;对象不同,属性不同空间不同,两者之间毫无任何关系。


4、想要定义类具有copy功能,就必须遵守NSCopying协议

5、copy方法:会调用对象的协议方法 -(id)copyWithZone:(NSZone *)zone;

①、伪拷贝

-(id)copyWithZone:(NSZone *)zone

{

    return [selfretain];

}


②、浅拷贝

-(id)copyWithZone:(NSZone *)zone

{

    //产生一样的对象空间

    Student *stu = [StudentallocWithZone:zone];

    //拷贝属性

    stu.name = [self.nameretain];

    stu.sex = [self.sexretain];

    return stu;

}

※注意:其中伪拷贝和浅拷贝中的retain只是将引用计数+1;


③、深拷贝

-(id)copyWithZone:(NSZone *)zone

{

    //拷贝对象空间

    Student *stu = [StudentallocWithZone:zone];

    

    //创建的属性内容空间

    stu.name = [[NSStringalloc]initWithString:self.name];

    stu.sex = [[NSStringalloc]initWithString:self.sex];

    return stu;

}

※:普通变量直接赋值即可,即NSInteger、CGFloat、char,例如,stu.age = self.age;








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

OC中的MRC内存管理方式 的相关文章

  • SystemUI学习记录

    OS android 7 1 由于项目需要需要对SystemUI进行定制化 xff0c 需求比较紧急 xff0c 没有很深入的去了解其整体代码 xff0c 仅仅记录下我的用到修改记录如下 xff1a 目录中有 或者 由于在不同的系统环境拷贝
  • informer

    list watch机制 list watch有两部分组成 xff0c 分别是list和watch list非常好理解 xff0c 就是调用资源的list API罗列资源 xff0c 基于HTTP短链接实现 xff1b watch则是调用资
  • kubelet - container manager

    containerManager 负责 node 节点上运行的容器的配置信息 xff0c 如 cgroup cpu device xff1b pod的创建流程参考 xff1a http www tianfeiyu com p 61 2825
  • 理解TCP/IP网络通信原理

    为什么会有TCP IP协议 在世界上各地 xff0c 各种各样的电脑运行着各自不同的操作系统为大家服务 xff0c 这些电脑在表达同一种信息的时候所使用的方法是千差万别 就好像圣经中上帝打乱了各地人的口音 xff0c 让他们无法合作一样 计
  • python 正则表达式点号与'\n'符号的问题

    匹配除了制表符和换行符之外的所有字符 前面的元字符出现任意次 xff0c 含0 43 前面的元字符出现一次或多次 xff1f 非贪婪模式 re S可以匹配多行 S s 匹配所有字符 所以 可以使用 s S 取代 在Python中可以使用方法
  • virsh的使用与实例步骤安装虚拟机

    Libvirt 有两种控制方式 xff0c 命令行和图形界面 图形界面 xff1a 通过执行名 virt manager xff0c 启动 libvirt 的图形界面 xff0c 在图形界面下可以一步一步的创建虚拟机 xff0c 管理虚拟机
  • Jboss低版本项目热部署到Jboss7

    Jboss低版本项目热部署到Jboss7 1 Jboss7 新特性 1 1 构建在 Modular Service Container上 xff0c 充分地利用了多核处理器的能力 xff0c 并发 按需启动服务 xff0c 启动速度更快 占
  • devstack安装openstack

    devstack是一套用来给开发人员快速部署Openstack开发环境的脚本 xff0c 其实对于整个安装过程没有什么好说的 xff0c 因为脚本写的很完善 xff0c 全程无脑式安装也没什么大问题 xff0c 但是因为公司里的网络环境不给
  • RBAC vs ABAC

    K8s在1 3版本中发布了alpha版的基于角色的访问控制 xff08 Role based Access Control xff0c RBAC xff09 的授权模式 相对于基于属性的访问控制 xff08 Attribute based
  • Attach detach controller manager 流程

    一 xff1a 初始化 1 adc 调用 InitPlugins 初始化 volumeplugins 1 1 初始化 dynamicplugins Currentlyonly Flexvolume plugins are dynamical
  • 洗牌、发牌算法 (打乱扑克牌顺序)

    img alt src https img blog csdn net 20130504122806254 include lt stdio h gt include lt stdlib h gt include lt time h gt
  • X11,GTK,QT,GNOME的区别与联系(UI工具总结)

    1 X11是X Window System Protocol Version 11 xff08 RFC1013 xff09 xff0c 是X server和X client之间的通信协议 X server是xfree86 xorg驱动下的显
  • Metrics-server

    概述 从 v1 8 开始 xff0c 资源使用情况的监控可以通过 Metrics API的形式获取 xff0c 具体的组件为Metrics Server xff0c 用来替换之前的heapster xff0c heapster从1 11开始
  • ARM嵌入式开发板无法ping localhost的问题

    移植环境 红色粗字体字 为修改后内容 xff0c 蓝色粗体字 为特别注意内容 1 xff0c 开发板 xff1a 韦东山JZ2440 2 xff0c linux 版本 xff1a linux 3 4 2 3 xff0c 参考文献 xff1a
  • Ali-Wax使用和源码解析系列-Wax的集成和调试环境搭建

    那些多余的话 在ios平台的基础框架中 xff0c 代码的直接动态部署一直是一个无法解决的问题 xff0c 所以我们只能退而求其次 xff0c 通过建立脚本语言和OC的bridge来实现动态更新的目标 在这个方向上 xff0c wax lu
  • OneNote代码高亮

    向OneNote 2016安装NoteHighlight 下载 msi 文件 xff0c 下载链接 下载之前查看自己的电脑上安装的OneNote版本以及位数 32 64 查看方法 xff1a 文件 gt 选项 gt 关于OneNote 20
  • Android生物识别-----BiometricPrompt

    到了AndroidP xff0c FingerprintManager就正式退役了 xff0c 系统新增了BiometricPrompt接口 xff0c 从接口名字 39 生物识别 39 也能看出来 xff0c 今后的安全验证功能 xff0
  • ROS学习笔记-from ._tf2 import *出错问题的解决

    复现古月居教程中关于tf的一节 xff0c 使用tf时提示错误 File 34 home pangweijian catkin ws src learning tf scripts turtle tf listener py 34 line
  • rosdep init 错误的终极解决方法

    rosdep init 错误的终极解决方法 从网站上下载需要的文件 xff1a https github com Vision4UAV rosdistro tree master rosdep 将文件夹和五个文件下载下来 拷贝到 etc r
  • vs2017调用dll文件提示“LNK2019 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ”解决方法

    如题 xff0c 通过vs2017定义的接口生成了dll文件并调用测试结果报错无法解析的外部符号 解决方法 xff1a 在C C 43 43 目录中包含dll对应的头文件 xff0c 库目录包含dll文件 xff0c 如下图所示 然后在链接

随机推荐

  • matlab使用app designer进行界面开发时,给控件的显示值进行赋值时,提示‘Text‘ 或‘Value‘ 必须为字符向量或字符串标量的解决办法

    使用 xff1a sprintf 39 s 39 taskID 进行变量值的格式化 如下图 xff1a 以及 xff1a
  • Chrome安装zotero connector 插件

    1 下载zotero connector插件 ZoteroConnectorv5 0 68 zip 其它文档类资源 CSDN下载 2 找到crx文件 xff0c 重命名为rar然后解压 3 打开扩展应用安装界面 4 打开开发者模式 xff0
  • UnBBayes考虑时序因素时的推理

    最近在使用UnBBayes进行MEBN的研究 xff0c 有时候推理需要考虑上一时刻的状态 一开始总是无法产生前一时刻状态的节点 当加入证据 t pre 61 pretimeOf t now 后就可以正常出现上一时刻的状态的节点了
  • zotero文献管理软件插件配置终极教程

    zotero是一款开源免费的文献管理工具 xff0c 在各位大神制作的插件加持下 xff0c 对于我来说已经没有满足不了的文献管理需求了 xff01 xff01 xff01 现将zotero使用教程整理如下 首先感谢贡献zotero和zot
  • ROS多机器人时rviz无法显示机器人模型,提示:param robot_description not found by searchParam()

    如图所示 xff0c 使用ROS进行多机器人仿真时 xff0c RobotModel无法显示机器人模型 xff0c 提示 xff1a param robot description not found by searchParam 原因 x
  • xcode使用gdal库

    GDAL Geospatial Data Abstraction Library 是一个在X MIT许可协议下的开源栅格空间数据转换库 它利用抽象数据模型来表达所支持的各种文件格式 它还有一系列命令行工具来进行数据转换和处理 GDAL提供对
  • VS2017#include "xxx.h"

    在学习使用vs编辑C 43 43 代码 xff0c 目前需要 记录下如何 include myHeaders h span class hljs keyword span span class hljs comment include my
  • MAC系统版本AnyLogic提示the font “Times“ is not available

    问题原因 xff1a MAC新版本系统中移除了Times字体 导致JAVA运行出现问题 如图所示为需要安装的Times字体 解决方法 xff1a 重新安装TImes字体 下载地址
  • LIBTIFF读取tiff文件时,打印buf出错

    如图所示 xff0c 按照官网提供的例程读取tiff文件 xff0c 并打印读取的值时 xff0c 提示 xff1a Subscript of pointer to incomplete type 39 void 39 代码如下 xff1a
  • 使用css选择器获取元素

  • udp如何实现可靠性传输?

    1udp与tcp的区别 TCP xff08 TransmissionControl Protocol 传输控制协议 xff09 是一种面向连接的 可靠的 基于字节流的传输层通信协议 UDP是User Datagram Protocol xf
  • SpringMVC项目中的常用配置

    在SpringMVC项目环境中 xff0c 经常需要配置一些信息 xff0c 包括 xff1a 前端控制器 xff08 DispatcherServlet xff09 处理器映射器 xff08 HandlerMapping xff09 处理
  • PHP 常见错误及其解决方法

    PHP是一种广泛应用于Web开发的编程语言 xff0c 由于其易学易用的特点 xff0c 越来越多的开发者开始使用PHP进行开发工作 然而 xff0c 在PHP开发过程中 xff0c 可能会出现各种错误 xff0c 导致程序无法正常运行 本
  • ubuntu22.04设置开启自启动命令脚本

    前言 xff1a 是这样的 xff0c 新的机器要挂在nfs存储 xff0c 报错 xff1a root 64 85 document mount t nfs o nolock 192 168 1 xx disk xiao home xia
  • 思考练习题

    1 循环求和 xff1a 利用循环语句计算从100加到500的整数的总和 public static void main String args int sum 61 0 for int i 61 100 i lt 61 500 i 43
  • 七步搞定CentOS6.8内核升级和Docker的安装

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 xff0c 可获得博主的秋招简历和复习笔记 一 内核的升级 最近安装需要在虚拟机Linux系统上安
  • 天干地支算法

    天干地支算法 首先我们需要知道什么是天干什么是地支 xff0c 有多少个天干多少个地支 xff1f 天干 Celestial Stem 中国古代的一种文字计序符号 xff0c 共10个字 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 xff0c
  • 面对突发流量,保证服务可用的4个手段

    前言 不知道你有没有这样的经历 xff0c 线上的系统突然来了很大的流量 xff0c 有可能是黑客的攻击 xff0c 也有可能是业务量远远大于你的预估 xff0c 如果你的系统没有做任何的防护措施 xff0c 这时候系统负载过高 xff0c
  • 【MongoDB】二、MongoDB数据库的基本操作

    MongoDB 二 MongoDB数据库的基本操作 实验目的实验内容任务一 xff1a xff08 1 xff09 创建数据库newdb xff08 2 xff09 在数据库newdb中创建集合mycollection xff08 3 xf
  • OC中的MRC内存管理方式

    MRC内存管理 xff1a Manual Reference Counting 一 人工引用计数 xff1a 内存的开辟和释放都由程序代码进 行控制 相对垃圾回收来说 对内存的控制更加灵活 可以在需要释放的时候及时释放 对程序员的要求较 高