【ARC机制下的循环引用 Objective-C语言】

前言

例如,有一个Person类,他有一本书,Book类,它有一个拥有者。。。
#import <Foundation/Foundation.h>
#import “Book.h”

@interface Person : NSObject
@property(nonatomic,strong)Book *book;
@end
#import “Person.h”

@implementation Person

  • (void)dealloc
    {
    NSLog(@“人挂了。。。”);
    }
    @end
    #import <Foundation/Foundation.h>
    @class Person;
    //两个类互相引用,必须有1方是用@class关键字,如果两边都是#import,就会造成循环引用,无限循环。。。
    @interface Book : NSObject
    @property(nonatomic,strong)Person *owner;
    //OC对象,用strong
    @end
    #import “Book.h”
    #import “Person.h”
    //Book.h文件用@class Person;了,所以Book.m文件再引用一下Person.h,不会报错,还能有提示
    @implementation Book
    – (void)dealloc
    {
    NSLog(@“书被烧毁了。。。”);
    }
    @end

#import <Foundation/Foundation.h>
#import “Person.h”
int main()
{
Person *p1 = [Person new];
Book *b1 = [Book new];
}
//这时候,人和书都可以被销毁。。。

一、如果人有1本书,书有1个拥有者,这两句话写进去了呢?

例如:
int main()
{
Person. *p1 = [Person new];
Book *b1 = [Book new];
p1.book = b1;
b1.owner = p1;
}
//这时候,人和书都挂不掉。。。
那写成如下这样呢?
nt main()
{
if(1)
{
Person. *p1 = [Person new];
Book *b1 = [Book new];
p1.book = b1;
b1.owner = p1;
}
}
//让p1和b1提前被销毁呢,但是两个对象都不能被挂掉。。。

二、人和书都挂不掉的原因。。。

1.p1指针,指向1个Person对象,b1指针,指向1个Book对象,Person对象里有一个强指针,book,Book对象里有一个强指针,owner,一切都是那么和谐,直到出现了这句话:p1.book = b1; b1.owner = p1;这时候,_book这个强指针,指向了Book对象,_owner这个强指针,指向了Person对象,if语句结束,p1指针没了,b1指针没了,但是_book强指针,还在,_owner强指针,还在,所以两个对象怎么也挂不掉,这就是ARC机制下的循环引用。。。

2.解决方案:让其中1个先挂,另外一个必然跟着挂吧,怎么让其中1个先挂呢?其中1个就不要用strong了,用weak。。。

例如:Book类这么定义:
#import <Foundation/Foundation.h>
@class Person;

@interface Book : NSObject
@property(nonatomic,weak)Person *owner;
@end

#import “Book.h”
#import “Person.h”
@implementation Book

  • (void)dealloc
    {
    NSLog(@“书被烧毁了。。。”);
    }
    @end

总结

结论:在ARC的机制下 ,当两个对象相互引用的时候,如果两边都是用strong,那么就会出现内存泄露,解决方案,很简单,1端使用strong,1端使用weak

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...