解决ARC的循环引用问题
循环 解决 引用 Arc 问题
2023-09-11 14:16:56 时间
看看下面的程序有什么问题:
BNRItem.h
@interface BNRItem : NSObject @property (nonatomic, strong) BNRItem *containedItem; @property (nonatomic, strong) BNRItem *container; ... @end
BNRItem.m
#import "BNRItem.h" @implementation BNRItem ... - (void)setContainedItem:(BNRItem *)containedItem { _containedItem = containedItem; self.containedItem.container = self; } @end
main.m
int main(int argc, const char * argv[]) { @autoreleasepool { // Create a mutable array object, store its address in items variable NSMutableArray *items = [[NSMutableArray alloc] init]; BNRItem *backpack = [[BNRItem alloc] initWithItemName:@"Backpack"]; [items addObject:backpack]; BNRItem *calculator = [[BNRItem alloc] initWithItemName:@"Calculator"]; [items addObject:calculator]; backpack.containedItem = calculator; backpack = nil; calculator = nil; for (BNRItem *item in items) { NSLog(@"%@", item); } // Destroy the mutable array object NSLog(@"Setting items to nil..."); items = nil; } return 0; }
上面的程序是有问题的,会导致循环引用(strong reference cycle)。
导致内存泄露。
解决方案:
将某个指针的特性设置为弱引用
@property (nonatomic, weak) BNRItem *container;
相关文章
- 图解Spring解决循环依赖
- 90 python高级 - 循环导入
- 《HTML5 2D游戏编程核心技术》——第3章,第3.3节实现游戏主循环
- JAVA集合为什么不能在foreach 循环中添加或删除元素?
- js 或 油猴 循环内 setTimeout 同步定时
- 模态对话框的消息循环原理及分析笔记
- Spring源码解析(十)分析一个Spring循环引用失败的问题
- c代码中while循环的一个死机问题引发的思考
- for循环(foreach型)举例
- 将循环结果通过管道传递给其他命令处理(done |)
- 循环中如果有某一次循环抛出异常了整个循环就停止的解决办法
- 微信小程序之循环<block></block>
- 递归快还是循环(迭代)快?
- 浅析setup如何通过ref获取子组件实例中的DOM结构/数据/方法及获取子组件实例数据都是空的处理(defineExpose API 的使用)、Vue3模板引用refs、在组合式API中使用template refs、for循环中如何获取及重置refs、如何监听模板引用
- Spring如何解决循环依赖问题