OC内存管理-ARC-循环引用
Person.h 文件 ,perosn的声明
#import <Foundation/Foundation.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic ,weak) Dog *dog;
@end
Person.m 文件 person的实现
#import "Person.h"
@implementation Person
- (void)dealloc
{
NSLog(@"Dog--dealloc");
}
@end
Dog.h 文件 ,Dog的声明
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
@property (nonatomic,strong) Person *person;
@end
Dog.m 文件, Dog 的实现
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"Person---dealloc");
}
@end
主函数
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
Person *p = [[Person alloc] init];
Dog *d = [[Dog alloc] init];
p.dog = d;
// d.person = p;
return 0;
}
内存管理分析图:
P<span style="font-family: Arial, Helvetica, sans-serif;">erson *p = [[Person alloc] init];</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> Dog *d = [[Dog alloc] init];</span>
p.dog = d;
d.person = d ;
<img src="https://img-blog.csdn.net/20160516174542448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
P<span style="font-family: Arial, Helvetica, sans-serif;">erson *p = [[Person alloc] init];</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> Dog *d = [[Dog alloc] init]; </span>
两行代码之后,局部变量就失效。
内存管理的指针指向图:
p.dog = d;
d.person = d ;
执行后 ,Person对象就会被销毁掉。Person对象销毁后,_dog成员变量就不存在了,所以最后都会被销毁掉了。
总结一下:
当两端应用时的解决方案:
1> ARC : 一端用strong,另一端用weak
2>非ARC: 一端用retain,另一端用assign