进击的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

相关文章

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir