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