Ios 执行后是否应将块引用设置为nil?
在Ios 执行后是否应将块引用设置为nil?,ios,objective-c,objective-c-blocks,Ios,Objective C,Objective C Blocks,在[block copy]之后执行block(),是否应设置块=nil?还是ARC已经帮我处理好了,所以我什么都不用做? 我对ARC在这里如何管理块引用有点困惑,我不确定将块设置为nil是否会破坏任何东西 我有这样的东西。有什么想法吗 typedef void (^C3Block)(void); // declare block, no return, no args // set flag to get _previewImage, then call the block - (voi
[block copy]
之后执行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???
}
typedef void(^C3Block)(void);//声明块,无返回,无参数
//设置标志以获取_previewImage,然后调用块
-(void)从BufferWithBlock:(C3Block)块中获取预览图像{
_takePreviewImageBlock=[block copy];//保存块引用以便以后调用
_shouldTakePreviewImageFromBuffer=是;
}
-(void)从缓冲区获取PreviewimageFromBuffer{
_takePreviewImageBlock();//调用块
_takePreviewImageBlock=nil;//通常,将块iVar设置为nil没有意义,因为您很可能会使用连续的-takePreviewImageFromBufferWithBlock:
调用将其重置。从内存管理的角度来看,\u takePreviewBlock
是一个iVar,ARC对它的管理与使用y other iVar-当owner类被释放时,它将在没有您交互的情况下被正确释放。如果\u takePreviewImageBlock
是一个具有strong属性的属性,那么只要包含此属性的对象存在,ARC就会保留它。
正如@Eugene所提到的,在调用takePreviewImageFromBufferWithBlock:
理解此行为后,您应该决定它是否符合您的设计。如果所有者将立即被解除分配,则无需自己取消其属性。否则,如果此块不再与您的逻辑相关,并且它将毫无理由地存储在内存中,则应取消其属性。我认为将其设置为零是一个好主意
,原因如下:
让我们调用这些方法在ImageLoader
中的类。假设我有一个类MyViewController
,它对这个ImageLoader
(比如说,它是一个实例变量),并向它传递一个保留self
的块(即MyViewController
)。为什么它会保留self
?嗯,您的ImageLoader
可能是异步工作的,因此,比方说,我希望我的MyViewController
足够长的时间来处理响应
好的,我们有一个保留周期。MyViewController
保留ImageLoader
,它保留块,它保留MyViewController
。但是,如果您在ImageLoader
中的操作结束时简单地nil
块变量,它将打破这个周期。否则,这些对象将如果ImageLoader
在其操作完成时将块变量设置为nil
,这是有意义的,因为它不再“需要”它
(您还可以认为,通过以不同的方式安排保留,可以避免上述场景中的问题,MyViewController
不应保留ImageLoader
。然后,在异步操作期间,ImageLoader
仍必须由正在进行的操作中的某些内容保留。ImageLoader
仍然保留保留MyViewController
的块。操作完成后,释放ImageLoader
的操作将释放所有内容,每个人都很高兴,无需将块变量设置为nil
)那么,您的意思是在操作结束时设置块变量nil
将有助于解除分配块,其保留的self
也将被解除分配?@Hlung:当一个堆块被解除分配时,它会释放它保留的捕获变量