2017-02-19 35 views
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对象之间的其他潜在差异是什么?

回答

1

根据Clang documentation你不必担心:可保持对象所有者类型的 __ 块变量通过用从栈拷贝移动的结果初始化堆拷贝移动离开堆栈。 所以ARC会为你做所有事情。

我认为所有这些东西都是LLVM中很久以前已经修复的一些错误引起的。

相关问题