iOS之手动内存管理

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;


FKUser.m

#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;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值