gpt4 book ai didi

ios - 了解保留计数以及在其中访问 self 的 block 。

转载 作者:可可西里 更新时间:2023-11-01 06:14:39 24 4
gpt4 key购买 nike

我对 block 的弱引用有基本的了解。我面临的问题是,

每当我在 block 内访问 self 时,self 的保留计数就会增加 2,而当我在默认 block 内访问 self 时(例如 UIViewAnimation) self 保留计数增加 1。

只是想了解为什么它会增加 2。 enter image description here

提前致谢!

最佳答案

根据 Clang 源代码生成 Objective-C 代码块。

Objective-C block 文字由 EmitBlockLiteral 函数生成。

llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) {

LLVM document深入解释什么是 block 字面量。不管怎样,这个函数生成一个 block 描述符和一个指定 block 的复制辅助函数。 copy 辅助函数用于捕获自动变量和 self

buildBlockDescriptor -> buildCopyHelper -> GenerateCopyHelperFunction

GenerateCopyHelperFunction 函数中,Clang 为每个将被 block 捕获的 Objective-C 对象自动变量发出 objc_storeStrong

for (const auto &CI : blockDecl->captures()) {
...
EmitARCStoreStrongCall(...

因此,这一行将计算 self 的保留计数 (1 -> 2)。

之后,EmitBlockLiteral 函数也会为每个将被 block 捕获的 Objective-C 对象自动变量发出 objc_retain

// Next, captured variables.
for (const auto &CI : blockDecl->captures()) {
...
EmitExprAsInit -> EmitScalarInit -> EmitARCRetain

因此这一行也会计算 self 的保留计数 (2 -> 3)。

我不知 Prop 体原因。但显然,在 block 复制辅助函数捕获对象之前保留 Objective-C 对象是有原因的。

关于ios - 了解保留计数以及在其中访问 self 的 block 。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27743182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com