标签:ase uiimage 强引用 ima tor mutable tps color 损坏
由alloc、copy、new、mutableCopy修饰的对象都会使引用计数值加一
release:释放对象
release = 0时,废弃对象
(1)带有alloc/new/copy/mutableCopy关键字,是自己生成对象并持有,自己持有的对象,自己得释放(release)
(2)取得任何人都不持有的对象,取得对象之后自己依旧不持有该对象本身,如下:
取得非自己生成并持有的对象:
如:id obj = [NSMutableArray array];
取得对象,但自己不持有,对象在超出指定范围时会自动释放(调用release方法,ARC应该是自动加入到自动释放池中,当autoreleasepool结束时,调用release释放对象),这时,如果想持有对象,需要对对象进行retain操作。即想要持有非alloc、new、copy、mutableCopy生成的对象,可以使用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,避免野指针的出现
(6)ARC下,NSAutoreleasepool和autorelease无法使用,可用__autoreleasesing代替autorelease,如下:
MRC 下 ARC下
一般不显示的使用__autoreleasesing,因为编译器会自动检查,如果不是以alloc、new、copy、mutableCopy创建的对象,会自动注册到autoreleasepool中。
标签:ase uiimage 强引用 ima tor mutable tps color 损坏
原文地址:http://www.cnblogs.com/MatyLin/p/7890214.html