gpt4 book ai didi

objective-c - iOS 5 阻止 ARC 桥接转换

转载 作者:技术小花猫 更新时间:2023-10-29 11:12:39 25 4
gpt4 key购买 nike

这个问题引用了这个问题: How to simplify callback logic with a Block?

我的标题有这些 typedef

typedef void (^StuffDoneBlock)(NSDictionary * parsedData);
typedef void (^StuffFailedBlock)(NSError * error);

在初始化中

stuffDoneCallback = Block_copy(done);
StuffFailedCallback = Block_copy(error);

在本文中它说 Block_copy 是不必要的。但它需要一个桥接 Actor 。编译器信息如下:

error: cast of block pointer type 'StuffDoneBlock' (aka 'void (^)(NSDictionary *__strong)') to C pointer type 'const void *' requires a bridged cast [4]
stuffDoneCallback = _bridge(Block_copy(done));
^~~~~~~~~~~~~~~~
/Developer-4.2/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/include/Block.h:60:61: note: instantiated from:
#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~

最佳答案

首先,您为什么还要使用 Block_copy()?除非您正在编写原始 C,否则您应该改为在 block 上调用 -copy,如 [done copy]。其次,ARC 将为您复制需要超过其初始化范围 [1] 的 block ,因此您甚至不需要再调用 -copy。唯一的“异常(exception)”是 block 类型的属性仍然需要具有 copy 属性。

[1]:这里似乎需要澄清。 ARC 仅在编译器 发现它需要超出其初始化范围时才隐式复制 block 。这基本上意味着当它被分配给一个脱离当前作用域的变量时(在父作用域中声明的堆栈变量、实例变量、静态变量等)。但是,如果它作为参数传递给方法/函数,编译器不会进行任何自动复制。通常这不是问题,因为需要保留堆栈帧之后的 block 的 block 感知方法/函数(dispatch_async()、完成 block 等)会为您复制它们。但是, block 感知的 API(例如 NSArray)不会隐式复制 block ,因为它们期望一个简单的-retain会成功的。如果您要将您的 block 传递给非 block 感知 API,并且该 block 需要在当前范围之外存在,则必须使用显式 -copy

关于objective-c - iOS 5 阻止 ARC 桥接转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723864/

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