引用计数:每个对象有一个与之相关的整数,称作“引用计数器”或者“保留计数器”,当某段代码需要访问一个对象时,该段代码会将对象的保留计数器+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];
}
@end
int 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、您不能释放非您所有的对象的所有权
.......待续