iOS内存管理规则

news/2024/7/20 15:10:55 标签: 内存管理, 移动开发

引用计数

Objective-C语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活,那就递增其引用计数;用完之后,就递减其计数。计数变为0时,就表示没有人在继续关注该对象了,于是就可以把它销毁。(iOS从未支持过垃圾回收机制

内存管理原则

  • 自己生成的对象,自己持有(alloc/new/copy/mutableCopy)
  • 非自己生成的对象,自己也能持有(retain)
  • 不在需要自己持有的对象时释放(release)
  • 非自己持有的对象不能释放

自己生成的对象,自己持有

使用alloc、new、copy、mutableCopy开头的方法名,意味着自己生成的对象自己持有。

id obj = [[NSObject alloc] init];
id obj = [NSObject new];
复制代码

非自己生成的对象,自己也能持有

使用上面方法之外的方法取得的对象,为非自己生成的对象,所以自己也不是该对象的持有者。可以使用retain方法持有非自己生成的对象。

id obj = [NSMutableArray array]; // 取得的对象存在,但自己不持有对象
[obj retain]; // 自己持有对象
复制代码

不在需要自己持有的对象时释放

自己持有的对象,不在需要时,持有者有义务释放该对象。使用release方法释放对象。当对象的引用计数为0时,则该对象被销毁(dealloc)。

id obj = [[NSObject alloc] init];
[obj release];

id obj = [NSMutableArray array];
[obj retain];
[obj release];
复制代码

注意:对象被释放后,不可再被访问

无法释放非自己持有的对象

在应用程序中,释放非自己持有的对象会造成崩溃。

id obj = [[NSObject alloc] init];
[obj release];
[obj release];

id obj = [NSMutableArray array];
[obj release]

//这两种情况都是释放了非自己持有的对象,都会导致应用程序崩溃
复制代码

这些关于Objective-C的内存管理方法,实际上不包括在该语言中,而是包含在Cocoa框架中。Cocoa框架中的Foundation框架中的NSObject类担负了内存管理职责。上述提到的alloc/retain/release/dealloc等方法都是NSObject类提供的方法。


http://www.niftyadmin.cn/n/1772936.html

相关文章

hbase 部署HA各种问题

1、jar包问题,hadoop高版本中的htrace没有需要的类,需要从hadoop低版本里面复制一个jar包。 2、hdfs://mycluster/hbase mycluster必须在hosts文件中指定ip地址,否则无法找到 3、Operation category READ is not supported in state stand…

Gos: Armed Golang

Gos: Armed Golang ? Project Address: https://github.com/storyicon/gos The current gos is still an alpha version, welcome more people to comment and improve it ?, you can add more commands to it, or modify something to make it perform better. You can down…

我在这个开源项目里找到了童年!

2019独角兽企业重金招聘Python工程师标准>>> 提到《俄罗斯方块》(Tetris),那真是几乎无人不知无人不晓,除此之外,相信许多程序员第一个编程实践项目就是编写一个俄罗斯方块或者是坦克大战 这类的游戏各种编…

简说设计模式——代理模式(续)

之前说了代理模式,即为其他对象提供一种代理以控制对这个对象的访问,详情见《简说设计模式——代理模式》,而代理模式常见的实现方式为静态代理及动态代理。 一、静态代理 所谓静态代理类是指:由程序员创建或由特定工具自动生成源…

人工智能让政务服务更有“温度”

2019独角兽企业重金招聘Python工程师标准>>> 在人们日常的生活、工作场景中,人工智能(AI)开始发挥越来越重要的作用,人类对人工智能充满了许多想象与期待。随着政府公共管理服务分工日趋细化复杂,将人工智能技术应用于政务工作中&…

1079. Total Sales of Supply Chain (25)BFS,DFS,并查集

A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone involved in moving a product from supplier to customer. Starting from one root suppli…

[Number]js中数字存储(0.1 + 0.2 !== 0.3)

和其他编程语言(如 C 和 Java)不同,JavaScript 不区分整数值和浮点数值, 所有数字在 JavaScript 中均用浮点数值表示,遵循IEEE754标准,在进行数字运算的时候要特别注意。 即:在js中的数字都是64…

谈谈你对Promise的理解

背景 Promise是为了解决Javascript回调嵌套过多导致回调地狱(callbackhell)而产生的。目前已被纳入了es2015规范,主流浏览器都支持Promise。为了在工作中更好的运用Promise,我们需要理解Promise规范与内部实现机制,下面我们来手动…