面试题答案
一键面试ARC处理循环引用原理
ARC(自动引用计数)通过编译器在编译期自动插入引用计数管理代码,来管理对象的生命周期。当对象的引用计数变为0时,ARC会自动释放该对象占用的内存。在循环引用场景下,由于两个对象相互持有对方,导致引用计数永远不会变为0,从而产生内存泄漏。ARC本身没有特殊机制直接打破这种循环引用,需要开发者手动处理。
解决循环引用的代码方法
- 使用
weak
关键字:在其中一个类的属性声明中使用weak
关键字,weak
引用不会增加对象的引用计数。例如,在B
类中:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : NSObject
@property (nonatomic, weak) A *aObject;
@end
- 使用
unowned
关键字:unowned
也是一种弱引用,与weak
不同的是,unowned
不会在对象释放后自动将指针置为nil
,适用于确保对象生命周期内不会被释放的场景。例如,在B
类中:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : NSObject
@property (nonatomic, unowned) A *aObject;
@end
一般优先使用weak
,因为它能避免野指针问题;只有在确定对象不会提前释放时,才考虑unowned
。