type
status
date
slug
summary
tags
category
icon
password
之前的
Block
系列文章,我们已经对Block
的方方面面都作了阐述,但是针对内存管理,我们还有最后一个需要讨论的话题——循环引用。本文将会针对循环引用做一个讨论,同时,将会对Block涉及的内存管理做一个总结。
一、循环引用
1.1 自循环引用
Block
内调用对象,对象拥有Block
,导致产生的双向强引用——循环引用。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Ff283ca8c-3a00-40dd-87c9-43c248d44a31%2F781cf121-546c-4e2f-8d61-6638b84fd0b3%2FUntitled.png?table=block&id=efce423c-1bba-4d6c-9e56-ef0bc6c37633&t=efce423c-1bba-4d6c-9e56-ef0bc6c37633&width=672&cache=v2)
解决方法,就是打破该循环,利用
__weak
或__unsafe_unretained
来打破该循环。__weak
:不会产生强引用,指向的对象销毁时,会自动让指针置为nil。
__unsafe_unretained
:不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变,也就是僵尸对象。
1.2 __block
导致的循环引用
使用
__block
导致产生的三角强引用——循环引用。![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Ff283ca8c-3a00-40dd-87c9-43c248d44a31%2F96b4d7f9-4b4d-4b1e-80f4-bbd5fade5398%2FUntitled.png?table=block&id=934f3599-53b2-4250-93e5-ccb7c406d057&t=934f3599-53b2-4250-93e5-ccb7c406d057&width=672&cache=v2)
打破该三角循环,我们主动将
person
对象,在Block
内部置为nil,但是需要主动调用执行该Block
。二、内存管理
下面总结了,捕获变量和内存管理的Block内如何处理。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Ff283ca8c-3a00-40dd-87c9-43c248d44a31%2F6d5753c2-118e-4e90-a813-ad6071c3709f%2FUntitled.png?table=block&id=56af8f30-f7b4-42a6-9dd5-45863e571629&t=56af8f30-f7b4-42a6-9dd5-45863e571629&width=748&cache=v2)
到此,Block的部分,我们已经讲述完了。
参考
示例代码