Hlu*_*ung 4 objective-c ios objective-c-blocks
之后[block copy]和执行block();,我应该设置block=nil?或者ARC已经为我管理了这个,所以我不需要做任何事情?我对ARC如何管理块引用有点困惑,我不确定将块设置为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???
}
Run Code Online (Sandbox Code Playgroud)
我认为设置它是个好主意nil,原因如下:
让我们调用这些方法所在的类ImageLoader.假设我有一个MyViewController强引用ImageLoader它的类(比如说它是一个实例变量),并将它传递给一个保留的块self(即MyViewController).为什么保留self?好吧,你的ImageLoader推测可能是异步的,所以,比方说,我希望我MyViewController能够长时间处理这个问题.
好的,我们有一个保留周期.的MyViewController保留ImageLoader,保留了块,其保持MyViewController.但是,如果你只是nil在操作结束时的块变量ImageLoader,它将打破这个循环.否则,这些对象将永远不会被释放.ImageLoader将块变量设置为nil在其操作完成时是有意义的,因为它不再"需要"它.
(你也可以说,在上面可以通过设置来避免场景中的问题保留不同-这MyViewController应该不保留ImageLoader,然后异步操作过程中,ImageLoader必须仍然保留的东西.从目前的操作ImageLoader仍保留了块,保留MyViewController.当操作完成后,操作释放ImageLoader会释放一切,每个人都很开心,而无需设置块变量nil.)
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |