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

标签 ios objective-c iphone objective-c-blocks weak-references

我对 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/

相关文章:

ios - 如何以编程方式禁用 UITextField 中的复制粘贴选项

ios - AES 加密到奇怪的字符

javascript - 点击/单击选择输入/文本框字段的内容

objective-c - 如何以编程方式在 UISegmentControl 中设置 Segment?

ios - EasyMapping 库 : can i get data for 1 object from different dictionary

ios - 如何在 iOS SDK 中创建一个伞形框架?

ios - 如何实现 UIViewControllerContextTransitioning 兼容交互转场

ios - 将 Alamofire 与 WatchKit 一起使用?

Objective-C 只用一个实例创建类的正确方法

iphone - 只读属性上的 Core Plot CPLineStyle 编译错误