iOS内存管理规则

引用计数

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

内存管理原则

  • 本身生成的对象,本身持有(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)。spa

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

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

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

没法释放非本身持有的对象

在应用程序中,释放非本身持有的对象会形成崩溃。cdn

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类提供的方法。对象

欢迎关注iOS学习社区公众号,学习更多iOS知识,iOS工做交流。blog

相关文章
相关标签/搜索