objective-c - 在 ARC 下,当直接分配给一个 ivar 时, block 是否会自动复制?

标签 objective-c automatic-ref-counting objective-c-blocks ivar

假设ARC下有如下代码,

typedef void (^MyResponseHandler) (NSError *error);
@interface MyClass : NSObject
{
    MyResponseHandler _ivarResponseHandler;
}

- (void)myMethod:(MyResponseHandler)responseHandler
{
    _ivarResponseHandler = responseHandler;
    ...
}

问题:block赋值给ivar时会自动复制到堆中吗?

My previous question暗示它在通过 @property 分配时被复制。但是,今天我使用了上面的代码并收到了一个 EXC_BAD_ACCESS,它通过更改为

得到修复

_ivarResponseHandler = [responseHandler 副本]

最佳答案

编辑:我之前的回答可能是错误的。

部分摘自 ARC docs说:

<强>3。可保留对象指针

一个可保留对象指针(或retainable pointer)是一个可保留对象指针类型(retainable type)的值。可保留对象指针类型分为三种:

  • block 指针(通过将脱字符号 (^) 声明符标记应用于函数类型而形成)

4.2。语义

赋值发生在评估赋值运算符时。语义因限定条件而异:

  • 对于__strong对象,首先保留新的指针对象;其次,左值加载了原始语义;第三,新的指针被存储到具有原始语义的左值中;最后,旧指针被释放。这不是原子执行的;面对并发加载和存储时,必须使用外部同步来确保安全。

4.4.1。对象

如果一个对象被声明为具有可保留对象所有者类型,但没有明确的所有权限定符,则其类型被隐式调整为具有 __strong 限定。

<强>7.5。 block

除了作为初始化 __strong 参数变量或读取 __weak 变量的一部分完成的保留之外,每当这些语义要求保留 block 指针类型的值时,它具有 Block_copy 的效果。当优化器发现结果仅用作调用的参数时,它可能会删除此类副本。

所以我认为答案是可能,这取决于优化器。

关于objective-c - 在 ARC 下,当直接分配给一个 ivar 时, block 是否会自动复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10453261/

相关文章:

warnings - 避免 block 中的 "expression result unused"警告

objective-c - 遍历特定类型的所有 subview

objective-c - iOS 5 - 从异步调用的方法中捕获返回值

objective-c - 将字符串值传递给要进行身份验证的网站 iOS

iphone - 无法理解 iPhone View 布局

ios - 使用弱变量而不是强变量的好处

ios - 数组中的 Swift 闭包在 Objective-c 中变为 nil

objective-c - 处理游戏中心通知

ios - 使用 block 指针作为成员变量时 iOS 中与 ARC 相关的崩溃

objective-c - 在 Objective-C 中,将 block 中的弱点分配给强点是什么意思?