MST

星途 面试题库

面试题:Objective-C中ARC如何处理对象的循环引用

在Objective-C的ARC环境下,假设有两个类A和B,A类中有一个属性指向B类对象,B类中也有一个属性指向A类对象,形成了循环引用。请简述ARC处理这种循环引用的原理,并且说明如何通过代码解决这种循环引用问题。
28.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

ARC处理循环引用原理

ARC(自动引用计数)通过编译器在编译期自动插入引用计数管理代码,来管理对象的生命周期。当对象的引用计数变为0时,ARC会自动释放该对象占用的内存。在循环引用场景下,由于两个对象相互持有对方,导致引用计数永远不会变为0,从而产生内存泄漏。ARC本身没有特殊机制直接打破这种循环引用,需要开发者手动处理。

解决循环引用的代码方法

  1. 使用weak关键字:在其中一个类的属性声明中使用weak关键字,weak引用不会增加对象的引用计数。例如,在B类中:
#import <Foundation/Foundation.h>
#import "A.h"

@interface B : NSObject

@property (nonatomic, weak) A *aObject;

@end
  1. 使用unowned关键字unowned也是一种弱引用,与weak不同的是,unowned不会在对象释放后自动将指针置为nil,适用于确保对象生命周期内不会被释放的场景。例如,在B类中:
#import <Foundation/Foundation.h>
#import "A.h"

@interface B : NSObject

@property (nonatomic, unowned) A *aObject;

@end

一般优先使用weak,因为它能避免野指针问题;只有在确定对象不会提前释放时,才考虑unowned