黑马程序员---06@property内存管理中如何避免循环引用的问题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

问题:一个人有一张身份证,一张身份证只对应一个人。那么问题来了,

请用代码描述以上关系,并使用@property相关参数对内存进行管理,并避免循环引用。

1>分析:

有2个类:Person类(属性:身份证)、Card类(属性:人)

2>内存分析:


3>代码

按照我们正常的思路写的话:

Person类:

Person.h文件
#import <Foundation/Foundation.h>

@class Card;

@interface Person : NSObject

@property (nonatomic, retain) Card *card;

@end

Person.m文件
#import "Person.h"

@implementation Person

- (void)dealloc
{
    NSLog(@"Person-----dealloc!");
    [_card release];
    [super dealloc];
}

@end

Card类

#import <Foundation/Foundation.h>

@class Person;

Card.h文件
@interface Card : NSObject

@property (nonatomic, retain) Person *person;

@end

Card.m文件
#import "Card.h"

@implementation Card

- (void)dealloc
{
    NSLog(@"Card-----dealloc!");
    [_person alloc];
    [super dealloc];
}

@end

main()主函数
main.m文件
#import <Foundation/Foundation.h>

#import "Person.h"
#import "Card.h"

int main(int argc, const char * argv[]) {
    
    Person *p = [[Person alloc] init];
    Card *c = [[Card alloc] init];
    
    p.card = c;
    c.person = p;
    
    [p dealloc];
    [c dealloc];
    return 0;
}


运行程序:


我们发现dealloc方法并没有被调用,说明Person对象和Card对象在互相retain,掐着彼此都不能释放,那么如何解决呢?

将双方中的任何一方的retain参数改为assign参数,即可,这里我修改Person文件中的参数retain。


而Card.h中的retain不变,也就是:

  • @property (nonatomic,assign)Card *card;

  • @property (nonatomic,retain)Person *person;

当然,retain修改为assign之后,Person类中dealloc方法也应该进行修改,将之前的[_card release]删掉;

修改后,运行程序:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值