gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:13:45 25 4
gpt4 key购买 nike

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

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