Objective_C采用了一种被称为引用计数(Reference Counting) 的机制来追踪对象状态,每个对象都有一个与之关联的整数,被称为引用计数器。
当一个对象的引用计数为0时,表明程序不再需要该对象,对象会被销毁。
若是对象还持有其他对象的引用,必须重写dealloc方法,在方法中释放该对象持有的其它对象。
1.创建FKItem类
FKItem.h
#import <Foundation/Foundation.h>
@interface FKItem : NSObject
@end
FKItem.m
#import "FKItem.h"
@implementation FKItem
-(id)init
{
self=[super init];
if(self)
{
NSLog(@"init方法中,引用计数为:%ld",self.retainCount);
}
return self;
}
-(void)dealloc
{
NSLog(@"系统开始销毁FKItem对象");
[super dealloc];
}
@end
2.创建FKUser类
FKUser.h
#import <Foundation/Foundation.h>
@class FKItem;
@interface FKUser : NSObject
{
//定义FKUser对象持有FKItem对象
FKItem *_item1;
}
-(void)setItem:(FKItem *)item;
-(FKItem *)item;
#import "FKUser.h"
@implementation FKUser
-(void)setItem:(FKItem *)item
{
if(_item1!=item)
{
//让item的引用计数+1
[item retain];
_item1=item;
}
}
-(FKItem *)item
{
NSLog(@"这里呢");
return _item1;
}
-(void)dealloc
{
//让item的引用计数-1
[_item1 release];
NSLog(@"系统开始销毁FKUser对象");
[super dealloc];
}
@end
main.m
/*
手动释放内存的基本思路:谁把对象的引用计数+1.谁就要在死之前把对象的引用计数-1
*/
#import <Foundation/Foundation.h>
#import "FKItem.h"
#import "FKUser.h"
int main(int argc, const char * argv[]) {
// //调用new方法创建对象 1
// FKItem *item=[FKItem new];
// NSLog(@"通过new方法创建对象实例后的retainCount的值:%ld",item.retainCount);
//
// //调用一次retain方法 2
// [item retain];
// NSLog(@"调用一次retain方法后retainCount的值:%ld",item.retainCount);
//
// //调用一次release方法 1
// [item release];
// NSLog(@"调用一次release方法后retainCount的值:%ld",item.retainCount);
//
// //再调用一次release方法 0(系统会自动调用dealloc方法)
// [item release];
FKItem *item=[FKItem new];
NSLog(@"创建出来的引用计数为:%ld",item.retainCount);
FKUser *user=[[FKUser alloc]init];
[user setItem:item];
NSLog(@"被FKUser对象持有后的引用计数为:%ld",item.retainCount);
// [item release];
// NSLog(@"%ld",item.retainCount);
[user release];
//如果只是把FKUser对象销毁,那item的引用计数还是应该为1的
NSLog(@"如果只是把FKUser对象销毁,那item的引用计数还是应该为1的:%ld",item.retainCount);
return 0;
}