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

本文讨论了Objective-C中由于强引用导致的循环引用问题,解释了如何通过使用`weak`属性来打破这种循环,防止内存泄漏。在ARC环境下,当两个对象相互持有强引用时,会导致对象无法释放,通过将一方的引用属性改为`weak`可以确保对象在不再需要时正确销毁。
摘要由CSDN通过智能技术生成

前言

例如,有一个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
在Book.h文件中:
#import “Book.h”
#import “Person.h”
@implementation Book
– (void)dealloc
{
NSLog(@“书被烧毁了。。。”);
}
@end

再运行一下main.m文件,输出如下:

输出:人挂了。。。

书被烧毁了。。。

总结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

清风清晨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值