进击的KFC:OC(十)内存管理高级

2023-12-22 08:38
文章标签 内存 管理 高级 oc kfc 进击

本文主要是介绍进击的KFC:OC(十)内存管理高级,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

⼀、属性的内部实现原理
assign下的属性内部实现

在Person.m中实现:// 实现set get方法,必须指定要赋值的成员变量@synthesize name = _name;- (void)setName:(NSString *)name
{if (_name != name){ //加判断条件,赋同样的值时,只retain一次[_name release]; //把_name指向的name空间计数-1_name =  [name retain];// _name指向新的空间name1,计数+1}
}- (void)dealloc
{[_name release];  // 把_name指向的name1计数从1->0,释放空间[super dealloc];
}- (instancetype)initWithName:(NSString *)name
{self = [super init];if(self){// _name = name;  // 这种写法对于对象类型是不安全的,可能会出现内存问题,但对于基本数据类型是安全的self.name = name; // 我们调用上面的set方法,是安全的,}return self;
}在mian函数里:
Person *p =[ [Person alloc]init];
NSString *name = [[NSString alloc] initWithFormat:@“王龙”];
NSString *name1 = [[NSString alloc] initWithFormat:@“龙”];
p.name=name; // 对nil release相当于什么都没做, name的计数  1->2
p.name = name1;  // name 的计数2->1,name1 的计数 1->2
[name release]; //name的空间计数为1->0,被释放掉了
[name1 release]; // name1的计数2->1
[p release];   //p的计数1->0,调用dealloc方法:[_name release],_name计数1->0,就把name1释放掉了,然后再调用[super delloc],p释放掉了

2.容器:collection

 Person *p1 = [[Person alloc] init];Person *p2 = [[Person alloc] init];Person *p3 = [[Person alloc] init];
// 数组添加元素的时候:
// 如果,把一个元素 添加到容器类的对象中(容器类:数组,字典,集合),那么系统将自动给数组中的元素发送retain消息,从而使数组中的元素的引用计数+1
NSArray *array = [[NSArray alloc]initWithObjects:p1,p2,p3 ,nil];    NSLog(@"%ld%ld",p1.retainCount,array.retainCount); // 2,1
// 数组释放时:
// 如果数组释放时,那么在释放之前,系统会自动给数组中的每一个元素 发送release消息,从而使数组中的元素引用计数-1

3.多态
多态的真谛:父类的指针 指向 子类的对象
多态的特点:
⽗类指针可以指向不同的⼦类对象
允许在多个类中定义同⼀个消息接⼝。
可以屏蔽不同⼦类对象之间的差异,写出通⽤代码。
适应需求的不断变化

总结
assign、retain、copy对应不同的setter实现。为实例变量赋值
时,尽量使⽤setter⽅法,再次赋值时,会把之前值release。
dealloc在对象引⽤计数为0时⾃动调⽤,不要显⽰调⽤。dealloc
实现体内,先要释放实例变量,然后执⾏[super dealloc];
便利构造器的内存管理是借助autorelease实现的。
集合会管理⾃⼰的元素。

这篇关于进击的KFC:OC(十)内存管理高级的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523303

相关文章

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖