iOS-学习笔记-内存管理 (1)自动引用计数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shengpeng3344/article/details/64443418

1. 内存管理

办公室照明问题:
在办公室照明设备只有一个情况下,A进入办公室,开灯(生成对象),需要照明(持有对象),B进入办公室,需要照明(持有对象),当B离开办公室,即不需要照明时(释放对象),由于A还在需要照明,故灯还是打开状态,当A也离开办公室,办公室内没有人需要照明(释放对象),则灯关闭(废弃对象);


这里写图片描述

故所以,引用计数相当于这里的需要照明人的个数,需要照明则retain,不需要照明则release,当人数=0时,对象自然废弃(dealloc)


2.内存管理的思考方式

其中,内存管理有以下几种思考方式

  • 自己生成的对象,自己所持有
  • 非自己生成的对象,自己也能持有
  • 自己持有的对象,不再需要时,释放
  • 非自己持有的对象,无法释放

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

使用以下名称开头的方法名,意味着自己生成对象且自己持有:
  • alloc
  • new
  • copy
  • mutableCopy

包含上面前缀的方法也一位置自己生成对象且自己持有:

  • allocMyObject
  • newMyObject
  • copy###
  • mutableCopy###

但对于以下名称,即使使用alloc,new,copy,mutableCopy开头,但不属于同一类别方法

  • allocate
  • newer
  • copying
  • mutableCopyed
/**
    自己生成并持有对象
*/

id obj = [[NSObject alloc]init];

其中copy方法基于NSCopying协议,由各类实现copyWithZone:方法生成并持有对象。同样mutableCopy方法基于NSMutableCopying协议,由各类实现copyWithZone:方法生成并持有对象。用这些方法生成的对象虽然是副本,但同alloc,new一样,在自己生成自己持有这点上并没有区别。

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

使用非上面所叙述的 alloc/new/copy/mutableCopy方法所取得的对象,则是非自己生成,但自己持有

//取得非自己生成,但持有的对象

id obj = [NSArray array];

//自己持有  retain
[obj retain];

3.不再需要自己持有的对象时释放

主要是弄清release与autorelease的区别

//自己生成并持有

id obj = [[NSObject alloc]init];

//释放

[obj release];
//自己生成并持有

id obj = [[NSObject alloc]init];

//取得对象存在 但自己不持有对象

[obj autorelease];

这里写图片描述

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

//自己生成并持有对象
id obj = [[NSObject alloc]init];

//obj 释放   自己不再持有
[obj release];
//崩溃 释放之后再次释放已非自己持有对象
[obj release];

更多底层alloc,copy等底层实现查看 《Objective-C高级编程 iOS与OS
X多线程和内存管理》
,本文内容大多撰自此书

猜你喜欢

转载自blog.csdn.net/shengpeng3344/article/details/64443418