假设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/