Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 执行后是否应将块引用设置为nil?_Ios_Objective C_Objective C Blocks - Fatal编程技术网

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:当一个堆块被解除分配时,它会释放它保留的捕获变量