您的位置:首页 > 移动开发 > Objective-C

Objective-C内存管理第四弹:循环引用

2015-12-13 21:47 441 查看
//main.m

/*
循环引用会导致两方均不能成功释放。

多个对象之间不能形成封闭的环
若出现这个封闭环所有对象都不会被释放

解决方法:
其中一端必须是assign
A(_B)->>>>>>>>>>B(_C)
|                |
|                |
|                |
|                |
|                |
D(_A)<<<<<<<<<<-C(_D)
*/
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {

//循环引用中两个对象均未成功释放
//    Person * person = [[Person alloc] init];
//    person.name = @"小花花";
//
//    Dog * dog = [[Dog alloc] init];
//    person.dog = dog;
//
//    dog.person = person;
//
//    [person release];
//    [dog release];

Person * person = [[Person alloc] init];
person.name = @"小花花";

Dog * dog = [[Dog alloc] init];
person.dog = dog;

dog.person = person;

[person release];
[dog release];

return 0;
}


//Person.h

#import <Foundation/Foundation.h>
#import "Dog.h"
@interface Person : NSObject

//名字:
@property (nonatomic, copy) NSString * name;

//狗
@property (nonatomic, retain) Dog * dog;

@end


//Person.m

#import "Person.h"

@implementation Person

- (void)dealloc
{
NSLog(@"%s", __func__);

self.name = nil;
self.dog = nil;
[super dealloc];
}

@end


//Dog.h

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

@interface Dog : NSObject

//@property (nonatomic, retain) Person * person;
//当存在循环引用的时候,其中一方必须是assign
@property (nonatomic, assign) Person * person;

@end


//Dog.m

#import "Dog.h"
#import "Person.h"

@implementation Dog

- (void)dealloc
{
self.person = nil;
NSLog(@"%s", __func__);
[super dealloc];
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: