循环引用问题

3-循环的retain 问题

人有宠物:

狗有主人:
那么使用在使用两个类时,再用 
#import相互导入 就会有问题,需要使用 @class

但是当两个类都要引用对方的对象进入自己的类做属性时,内存泄露的另一种情况。解决办法其中一个先释放(但是还有僵尸对象的问题)

另一个解决办法是一个用 retain,一个用 assign.  在person.h中,定义dog类型的 属性时用retain  .在 dog.h中,定义owner时 用asiign,就可以解决。

看我们看一个狗和人循环引用的例子:

//  main.m
//  08-循环引用
//
//  Created by apple on 15/8/13.
//
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = [Person new];
        Dog *d = [Dog new];
        
        p.dog = d;   // setDog:
        d.owner = p;
        
        
        [d release];
        [p release];
    }
    return 0;
}


persn.h文件():


//  Person.h
//  
//
//  Created by apple on 15/8/12.
//
//

#import <Foundation/Foundation.h>
@class Dog;


@interface Person : NSObject

@property (nonatomic, retain) Dog *dog;

@end

person.m 文件:

//  Person.m
//  
//
//  Created by apple on 15/8/12.
//
//

#import "Person.h"

@implementation Person
- (void)dealloc {
    
    [_dog release];
    
    NSLog(@"Person 释放");
    [super dealloc];
}
@end


dog .h


//  Created by apple on 15/8/13.
//
//

#import <Foundation/Foundation.h>
@class Person;

@interface Dog : NSObject

@property (nonatomic, assign) Person *owner; // owner 所有者

@end


dog.m

//  Created by apple on 15/8/13.
//
//

#import "Dog.h"

@implementation Dog
- (void)dealloc {
    
    [_owner release];
    
    NSLog(@"Dog dealloc");
    [super dealloc];
}
@end





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个IT大叔的内心独白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值