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

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户