1
我试图做一个cancellble块,这是我的代码:是否有做出块一堆副本,如果该块是在dispatch_after功能使用的方法
typedef void(^dispatch_cancelable_block_t)(BOOL canceled);
dispatch_cancelable_block_t dispatch_after_with_cancel(NSTimeInterval delay, dispatch_block_t block) {
if (block == nil) {
return nil;
}
__block dispatch_block_t originalBlock = [block copy];
__block dispatch_cancelable_block_t cancelableBlock = [^(BOOL canceled){
if (!canceled && originalBlock) {
originalBlock();
}
originalBlock = nil;
} copy];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (cancelableBlock) {
cancelableBlock(NO);
cancelableBlock = nil;
}
});
return cancelableBlock;
}
和块可以使用此功能被取消:
void cancel_block(dispatch_cancelable_block_t block) {
if (block == nil) {
return;
}
block(YES);
block = nil;
}
...我已经寻找了一段时间,但我得到的一切3或4年前写这可能不是已经包含了苹果近期的变化。
我的问题是[block copy]和ARC下的cancelableBlock仍然需要复制吗?我们是否仍然需要复制块或使用__block说明符块已被保留?在内存管理方面,块和其他目标c对象之间的其他潜在差异是什么?