gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 05:09:42 24 4
gpt4 key购买 nike

[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/

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