进击的KFC:OC(第九天):内存管理初级

2023-12-22 08:38

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

⼀、内存管理介绍
内存的问题体现在两个方面:内存溢出,野指针异常
内存管理的⽅式:
垃圾回收(gc): 在OSX系统中用到
MRC(Manual Reference Count) // 手动引用计数
ARC(Auto Reference Count):自动引用计数
在ios开发过程中,用到的是引用计数的方法

⼆、内存管理机制
OC采⽤引⽤计数机制管理内存,当⼀个新的引⽤指向对象时,引⽤计数器就递增,当去掉⼀个引⽤时,引⽤计数就递减。当引⽤计数到零时,该对象就将释放占有的资源。

影响引⽤计数的⽅法:
+alloc : 开辟内存空间,让被开辟的内存空间的引⽤计数变为1。
这是由0到1的过程。-retain: 引⽤计数加1,如果内存空间之前引⽤计数为1,ratain之后变为2,如果引⽤计数是5,retain之后变为6
-copy : 把某⼀内存区域的内容拷⻉⼀份,拷⻉到新的内存空间⾥
去,被拷⻉区域的引⽤计数不变,新的内存区域的引⽤计数为1。-release : 引⽤计数减1,如果内存空间之前引⽤计数为4,release之后变为3,如果之前引⽤计数为1,release之后变为0,内存被系统回收。

-autorelease : 未来的某⼀时刻引⽤计数减1。如果内存之前引⽤计数为4,autorelease之后仍然为4,未来某个时刻会变为3。它是需要依托一个叫autoreleasepool自动释放池的,当调用autorelease的对像出了释放池的时候,释放池会给这些对象发送一个release的消息.

三、内存管理原则
引⽤计数的增加和减少相等,当引⽤计数降为0之后,不应该再使⽤这块内存空间。
凡是使⽤了alloc、retain或者copy让内存的引⽤计数增加了,就需要使⽤release或者autorelease让内存的引⽤计数减少。在⼀段代码内,增加和减少的次数要相等。

四、copy
-跟retain不同,⼀个对象想要copy,⽣成⾃⼰的副本,需要实现NSCopying协议,定义copy的细节(如何copy)。如果类没有接受NSCopying协议⽽给对象发送copy消息,会引起crash。

Person类copy⽅法的实现:
第一步:
Person.h⽂件
@interface Person : NSObject<NSCopying>
@property(nonatomic, retain)NSString *name;
@property(nonatomic, assign)int age;
@end第二步:
Person.m⽂件
@implementation Person
- (id)copyWithZone:(NSZone *)zone{Person *p = [[Person allocWithZone:zone]init];p.age = self.age;p.name = self.name;return p;
// copy方法 对引用计数的影响,要看你是怎么想的
//分为三种拷贝方法:// 1.伪拷贝:拷贝完还是那一个对象(直接返回)//return self; // 调用时 计数不变  ,// 2.浅拷贝:// 拷贝后,有两个对象,但是他们的值是同一个值,引用计数变 化,被拷贝的对象不变,拷贝出来的对象从0-1// Person *p =[[Person alloc]initWitnName:_name age:_age];// return p;// 3.深拷贝: 拷贝出新的对象, 并且 对象的值也重新拷贝一份,再赋值// 对字符串进行拷贝 拷贝的结果 要看字符串这个类如何实现的拷贝方法 对不可变字符串的拷贝相当于直接retain// 对可变字符串 拷贝时,就是真拷贝了一个新的出来//NSString *name = [_name copy];//Person *p = [[Person alloc] initWitnName:name age:_age];//return p;}第三步:
main.m⽂件
Person *p = [[Person alloc]init];
p.name = @”张三”;
p.age = 20;
Person *p2 = [p copy];
p2是p的副本。p2.name与p.name⼀样。p2.age与p.age⼀样。

总结:
1.OC借助引⽤计数机制去管理内存,凡是使⽤了alloc、copy、retain等⽅法,增加了引⽤计数,就要使⽤release和autorelease减少引⽤计数,引⽤计数为0的时候,对象所占的内存,被系统回收。

2.autorelease是未来某个时间(出autoreleasepool)引⽤减⼀,不是即时的。

3.不是任何对象都可以接收copy消息,只有接受了NSCopying协议的对象才能接收copy消息。

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



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

相关文章

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变