ios - 我应该在执行后将 block 引用设置为 nil 吗?

标签 ios objective-c objective-c-blocks

[block copy]执行完block();后,是否应该设置block=nil?还是 ARC 已经为我管理了这个,所以我什么都不用做? 我对 ARC 如何在这里管理 block 引用感到有点困惑,我不确定将 block 设置为 nil 是否会破坏任何东西?

我有这样的东西。有什么想法吗?

typedef void (^C3Block)(void);    // declare block, no return, no args

// set flag to get _previewImage, then call the block
- (void)takePreviewImageFromBufferWithBlock:(C3Block)block {
    _takePreviewImageBlock = [block copy]; // save block ref for calling later
    _shouldTakePreviewImageFromBuffer = YES;
}

- (void)gotPreviewImageFromBuffer {
    _takePreviewImageBlock(); // calls the block
    _takePreviewImageBlock = nil; // <---- should I do this???
}

最佳答案

我认为将它设置为 nil 是个好主意,原因如下:

让我们调用这些方法在 ImageLoader 中的类.假设我有一个类 MyViewController对这个有很强的引用ImageLoader (例如,它是一个实例变量),并将一个保留 self 的 block 传递给它(即 MyViewController )。为什么保留self ?嗯,你的ImageLoader大概是异步工作的,所以,比如说,我想要我的 MyViewController足够长的时间来处理响应。

好的,所以我们有一个保留周期。 MyViewController保留 ImageLoader ,保留 block ,保留 MyViewController .但是,如果您只是 nil ImageLoader 中操作结束时的 block 变量,就会打破这个循环。否则这些对象将永远不会被释放。这对 ImageLoader 有点意义将 block 变量设置为 nil当它的操作完成时,因为它不再“需要”它。

(您还可以争辩说,可以通过以不同方式安排保留来避免上述场景中的问题——MyViewController 应该保留 ImageLoader。然后,在异步操作期间, ImageLoader 必须仍由正在进行的操作中的某物 保留。ImageLoader 仍保留保留 MyViewController 的 block 。操作完成后,释放 ImageLoader 的操作将释放所有内容,每个人都很高兴,无需将 block 变量设置为 nil。)

关于ios - 我应该在执行后将 block 引用设置为 nil 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633466/

相关文章:

ios - 在共享扩展中启用 Firebase 身份验证

ios - Fabric 中的未知崩溃 [FIRAAlarm 取消]

ios - 无法将类型 '[String : String?]' 的值转换为预期的参数类型 '[String : AnyObject?]'

c - Smalltalk 风格的消息与 C 风格的函数

objective-c - iOS + jqueryMobile 无法在加载 html 文件时捕获 webview 事件

ios - 获取 block 的弱类型的宏

objective-c - UIWebView 中嵌入的 Youtube 在进入全屏时导致 iPad 崩溃

objective-c - iOS 下载安全

objective-c - 实现一个将 block 用作回调的方法

ios - Swift 将 AnyObject 转换为 block