我对 block 的弱引用有基本的了解。我面临的问题是,
每当我在 block 内访问 self 时,self 的保留计数就会增加 2,而当我在默认 block 内访问 self 时(例如 UIViewAnimation) self 保留计数增加 1。
只是想了解为什么它会增加 2。
提前致谢!
最佳答案
根据 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/