IOS开发(15)Objective-C-内存管理-自动释放池(@autoreleasepool)

2023-10-21 06:38

本文主要是介绍IOS开发(15)Objective-C-内存管理-自动释放池(@autoreleasepool),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 自动释放池的原理

存入到自动释放池中的对象,在自动释放池被销毁的时候,会自动调用存储在自动释放池中的所有对象的release方法。
这样,将创建的对象存储到自动释放池之中,就不再需要手动的release这个对象了。因为自动释放池销毁的时候,就会自动的调用自动释放池中所有的对象的release。

2 如何创建自动释放池

    //{}表示这个自动释放池的范围@autoreleasepool{}

3 如何将对象存储到自动释放池之中

在自动释放池之中调用对象的autorelease方法,就会将对象存储到当前自动释放池之中。
这个autorelease方法返回的是对象本身,所以,我们可以这么写

    @autoreleasepool {Person *person = [[[Person alloc] init] autorelease];   }

这个时候,当这个自动释放池执行完毕之后,就是立即为这个自动释放池中的对象发送1条release消息。

4 注意事项

  1. 只用在自动释放池中调用了对象的autorelease方法,这个对象才会被存储到这个自动释放池中。
  2. 对象创建可以写在自动释放池外边,在自动释放池之中,调用对象的autorelease方法,就可以将对象存储在自动释放池之中。
  3. 如果对象的autorelease方法的调用放在自动释放池的外面,就无法将其存储在这个自动释放池之中。
  4. 当自动释放池结束的时候,仅仅是对存储在自动释放池中的对象发送1条release消息,而不是销毁对象。
  5. 如果在自动释放池中,调用对象多次autorelease方法。在自动释放池结束的时候,会出现野指针问题。
  6. 在自动释放池中,如果调用已经存储在自动释放池中对象的release方法,会出现野指针问题
  7. 将对象存储到自动释放池中,并不会使对象的引用计数器+1。
  8. 自动释放池可以嵌套

5 autorelease使用规范

  1. 创建对象,将对象存储到自动释放池中,不需要手动release。
  2. 类方法创建对象,要求这个类方法中将创建的对象调用autorelease
    + (instancetype) person {return [[[self alloc] init] autorelease];}

这篇关于IOS开发(15)Objective-C-内存管理-自动释放池(@autoreleasepool)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA