Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS 5块电弧桥接铸造_Objective C_Ios_Automatic Ref Counting_Objective C Blocks - Fatal编程技术网

Objective c iOS 5块电弧桥接铸造

Objective c iOS 5块电弧桥接铸造,objective-c,ios,automatic-ref-counting,objective-c-blocks,Objective C,Ios,Automatic Ref Counting,Objective C Blocks,本问题提及本问题: 我的标题有这些typedef typedef void (^StuffDoneBlock)(NSDictionary * parsedData); typedef void (^StuffFailedBlock)(NSError * error); 在初始阶段 stuffDoneCallback = Block_copy(done); StuffFailedCallback = Block_copy(error); 在本文中,它说块拷贝是不必要的。但它需要一个桥牌。 编

本问题提及本问题:

我的标题有这些typedef

typedef void (^StuffDoneBlock)(NSDictionary * parsedData);
typedef void (^StuffFailedBlock)(NSError * error);
在初始阶段

stuffDoneCallback = Block_copy(done);
StuffFailedCallback = Block_copy(error);
在本文中,它说块拷贝是不必要的。但它需要一个桥牌。 编译器消息如下所示:

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\u copy()
?除非您正在编写原始C,否则应该在块上调用
-copy
,如
[done copy]
中所述。其次,ARC将为您复制需要超过其初始化范围[1]的块,因此您甚至不再需要调用
-copy
。唯一的“例外”是块类型属性仍然需要具有
copy
属性


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

您不需要桥接强制转换或块副本。你能告诉我stuffDoneCallback和done是如何声明的吗?我有一个
NSMutableArray
块,当使用ARC发布时,这些块会发生故障。当我开始将块的副本(通过
[block copy]
获得)传递到数组时,segfault消失了,因此这表明在某些情况下确实需要显式复制块。是的,如果块将超过当前作用域,则不希望占用块的API确实要求您
-复制
。这与ARC无关,因为期望ARC复制传递给其他方法/功能的所有块是不合理的。在这种情况下,您可能会考虑编辑。“其次,ARC将为您复制需要超出其初始化范围的块,因此您甚至不需要再调用
-copy
。”这句话似乎表明了相反的情况。@zneak:“超出其初始化范围”意味着它们位于编译器可见的、将存在于该范围之外的位置。换句话说,如果您声明一个堆栈变量,输入一个范围,为变量指定一个块,退出该范围,ARC将为您复制该块。类似地,如果将其指定给ivar或静态。但是,如果将其传递给方法(或指定给特性),则该方法负责知道是否需要复制块。如果该方法是用ARC编译的,并且它知道它有一个块,那么它也可能会正常工作™.@zneak:当你把一个块传递给一个方法,这个方法接受一个任意的obj-c对象,却不知道它刚刚被传递了一个块时,唯一真正的问题就出现了。这里的正常行为是,如果对象需要超过堆栈帧,API将
-保留它。但是,块需要是
-copy
'd。因此,在这种情况下,只需要显式复制块。