学习笔记:Objective C 的内存管理(3)----@class以及Autorelease用法

2023-12-15 00:32

本文主要是介绍学习笔记:Objective C 的内存管理(3)----@class以及Autorelease用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


一、@class

(一)1、@class作用:仅仅告诉编译器,某某是一个类

   2、开发中引用一个类的规范

1>在 . h 文件中用@class来声明类

2>在 . m文件中用#import来包含类的所有东西

(二)和#import的区别

1、#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件

中 B*b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正查看B类中信息。

2、如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改

动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class

方式就不会出现这种问题了。

3、在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类。

(三)循环retain

现象:A对象retain了B对象,B对象又retain了A对象,永远无法释放。

解决方法:一端用retain,一端用assign。

二、autorelease用法//放到栈(数据结构里的栈,先进后出原则)里面的池子

(一)基本用法

1、会将对象放到一个自动释放池中

@autoreleasepool{

......                 

}

2、当自动释放池被销毁时,会对池子里面的所有对象做一个release操作

3、返回对象本身

4、调用完autorelease方法后,对象的计数器不变

(二)好处:

1、不用关心对象释放的时间

2、不用关心什么时间调用release

(三)使用注意

1、占用内存较大的对象不要随便使用autorelease

2、占用内存较小的对象使用autorelease,没有太大影响

(四)错误写法

1、alloc后调用了autorelease,又调用release

2、连续调用多次autorelease

(五)自动释放池

1、在IOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构存在(先进后出)

2、当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池

(六)自动释放池的创建方式


5.0版本以前:


5.0版本以后:


一般可以为类添加一个快捷创建对象的类方法

+(id)book{

return[[[Book alloc] init] autorelease];

} 当调用[Book book]时,不用考虑何时释放返回的Book对象

(七)规律

一般来说除了alloc、new或copy之外的方法创建的对象都被声明了autorelease,不需要再release。

这篇关于学习笔记:Objective C 的内存管理(3)----@class以及Autorelease用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

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

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

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

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

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

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

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

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

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和