OC系列高级-内存管理二

本文通过创建Dog和Person类实例,详细解析了MRC(手动引用计数)模式下set和get方法的工作原理及注意事项,特别是对对象引用计数的变化进行了深入分析。

一.MRC模式下set和get方法

首先我们创建一个Dog类

Dog.h:

#import <Foundation/Foundation.h>

@interface Dog : NSObject
@property (assign) int ID;
@end

Dog.m:

#import "Dog.h"

@implementation Dog
@synthesize ID = _ID;
- (void)dealloc{
    NSLog(@"Dog ID%d is death",_ID);
    [super dealloc];
}

@end

再创建一个Person类

Person.h:

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject
{
    Dog *_dog;
}
-(void)setDog:(Dog *)newDog;
-(Dog *)dog;
@end

Person.m:

#import "Person.h"

@implementation Person

-(void)setDog:(Dog *)newDog{
    NSLog(@"%d",_dog.retainCount);
    if(_dog != newDog){
        [_dog release];
        _dog = nil;
        NSLog(@"%d",_dog.retainCount);
        _dog = [newDog retain];
        NSLog(@"%d",_dog.retainCount);
    }
}

-(Dog *)dog{
    return [_dog autorelease];
}

- (void)dealloc
{
    NSLog(@"Person is death");
    [super dealloc];
}

@end

在main函数中我们创建两个dog,并且创建person

        Dog *dog1 = [[Dog alloc]init];
        dog1.ID = 1;
        Dog *dog2 = [[Dog alloc]init];
        dog2.ID = 2;
        
        Person *p = [[Person alloc]init];

person set一个dog

   [p setDog:dog1];

此时,set方法完之后dog.retainCount值为2,因为dog创建和retain

当我们把dog1 release操作

        [dog1 release];
        NSLog(@"%d",dog1.retainCount);  //值为1
NSLog(@"%zd",p.retainCount);  //person的retainCount值为1,因为只是创建

我们把person release操作

        [p release];
        p = nil;

此时person retainCount值为0,并且调用了dealloc方法,但是person里的dog的retainCount值为1;所以我们在回收person时要把它的对象属性release操作,要不会引起内存空间的泄漏

当person没有执行release操作,再set一个dog1操作,此时,person的dog的retainCount值为1,即没有进行retain操作

注意点:

1.析构函数的release时一定要release掉包含的对象

转载于:https://www.cnblogs.com/kaihuacheng/p/5624274.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值