ios内存管理

来源:互联网 发布:炉石盒子大数据 编辑:程序博客网 时间:2024/06/11 03:24

引用计数:每个对象有一个与之相关的整数,称作“引用计数器”或者“保留计数器”,当某段代码需要访问一个对象时,该段代码会将对象的保留计数器+1,表示需要访问这个对象;当结束对该对象的访问时,保留计数器-1,表示它不在访问该对象;当保留计数器为0时,对象被销毁,所占内存被系统收回。

当使用new、retain或copy创建一个对象的时候,该对象的保留计数器+1;要增加对象的保留计数器值,可以发送retain消息;要减少对象保留计数器的值,发送release或autorelease消息;当对象的保留计数器值为0时,Objective-C会自动向对象发送一条dealloc消息。

autorelease(自动释放)和release功能类似,向一个对象发送release消息时,会立刻执行,使对象的保留计数器-1;发送autorelease时,表示将会在某个合适的阶段将对象保留计数器-1.

#import <Foundation/Foundation.h>@interface Test : NSObject@end@implementation Test-(id)init{    if(self = [super init])    {        NSLog(@"对象数量:%ld",[self retainCount]);    }    return self;}-(void)dealloc{    NSLog(@"对象被清空");    [super dealloc];}@endint main(){    Test *t = [[Test alloc]init];//1        [t retain];    NSLog(@"对象数量:%ld",[t retainCount]);//2        [t retain];    NSLog(@"对象数量:%ld",[t retainCount]);//3        [t release];    NSLog(@"对象数量:%ld",[t retainCount]);//2        [t release];    NSLog(@"对象数量:%ld",[t retainCount]);//1        [t release];//0 -- 计数器为0时,会自动像父类发送dealloc消息销毁对象,dealloc消息需在子类重写,不可直接调用父类中的方法        return 0;}

对象所有权:如果一个对象具有指向其他对象的实例变量,则该对象拥有这些变量;同样,如果一个函数创建了某个对象,则该函数拥有它创建的这个对象。

1、任何自己创建的对象都归自己所有(new、retain或copy创建一个对象)

2、可以使用retain来获得一个对象的所有权(一个对象的所有者可能不止一个,拥有一个对象的所有权就表示我们需要保持该对象存在)

3、当您不再使用您所拥有的对象时,您必须释放对这些对象的所有权(向对象发送release或者autorelease消息)

4、您不能释放非您所有的对象的所有权

.......待续