内存管理

由alloc、copy、new、mutableCopy修饰的对象都会使引用计数值加一

release:释放对象

release = 0时,废弃对象

(1)带有alloc/new/copy/mutableCopy关键字,是自己生成对象并持有,自己持有的对象,自己得释放(release

 

2)取得任何人都不持有的对象,取得对象之后自己依旧不持有该对象本身,如下:

取得非自己生成并持有的对象:

       如:id obj = [NSMutableArray array];

取得对象,但自己不持有,对象在超出指定范围时会自动释放(调用release方法,ARC应该是自动加入到自动释放池中,当autoreleasepool结束时,调用release释放对象),这时,如果想持有对象,需要对对象进行retain操作。即想要持有非allocnewcopymutableCopy生成的对象,可以使用retain操作使自己持有该对象释放非自己持有的对象,程序会崩溃。

 

3)苹果采用引用计数表存储引用计数值(引用计数表又称散列表):引用计数表由引用计数值+对象的内存块地址组成。

在调试时,即使出现故障导致对象占用的内存块损坏,但只要引用计数表没有被破坏,依旧能够确认各内存块的位置。

 

(4)autorelease

autorelease方法就是当对象超出其作用域时,对象的release实例方法就会被调用,释放其对象。

 

autorelease的使用方法:

(1)生成NSAutoreleasepool对象

  (2)调用已分配对象的autorelease实例方法

(3)废弃NSAutoreleasepool对象

 

 

大量产生autorelease时,只要不废弃NSAutoreleasepool对象,那么生成的对象就不能释放,因此会产生内存不足的现象。如:读入大量图片时,改变其尺寸。读入图片时生成NSData对象,并在NSData对象中生成UIImage对象,改变尺寸后生成新的UIImage对象,会产生大量的autorelease。

 

iOS中用于返回autorelease对象的方法:

id array = [NSMutable arrayWithCapacity:1];//分配指定的内存空间

 相当于:

id array = [[[NSMutableArray alloc] initWithCapacity:1] autorelease];

 

(5)__strong修饰符表示对象的“强引用”,持有强引用的对象在超出其作用域时被废弃,随着强引用超出其作用域,对象会被释放(release减1)

 如:id __strong obj = [NSMutableArray array];

取得非自己生成并持有的对象,因为用了__strong修饰,所以自己持有了该对象,当超出作用域时,强引用失效,因此自动释放自己持有的这个对象,又因为对象的所有者不存在,因此废弃了该对象。

 注:id类型,默认为__strong修饰符,其实无需自己写上__strong

 

__weak:弱引用,不持有对象实例,不会使对象引用计数值加一,使用__weak修饰的对象,在对象被释放时,指向该对象的指针会被置为nil,避免野指针的出现

 

(6ARC下,NSAutoreleasepoolautorelease无法使用,可用__autoreleasesing代替autorelease如下:

 

                            MRC                                                                                   ARC

 

 

 

一般不显示的使用__autoreleasesing因为编译器会自动检查,如果不是以allocnewcopymutableCopy创建的对象,会自动注册到autoreleasepool

posted @ 2017-11-24 13:42  温水青蛙。  阅读(110)  评论(0编辑  收藏  举报