Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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:块复制并添加到可变阵列,清空阵列时是否需要释放它们?_Ios_Objective C_Nsmutablearray_Objective C Blocks - Fatal编程技术网

iOS:块复制并添加到可变阵列,清空阵列时是否需要释放它们?

iOS:块复制并添加到可变阵列,清空阵列时是否需要释放它们?,ios,objective-c,nsmutablearray,objective-c-blocks,Ios,Objective C,Nsmutablearray,Objective C Blocks,因此,如果我有: SomeBlock myBlock = ^(){}; [self.mutableArray addObject: [myBlock copy] ]; 如果需要,请稍后: [self.mutableArray removeAllObjects]; 那么,我应该首先遍历数组中的所有块并释放它们中的每一个吗 谢谢 编辑: 我没有使用ARC,当我将一个块添加到数组中时,我在某处看到我需要复制它,这就是为什么我在将它添加到数组中时会执行[block copy],因此我认为我应该在从数

因此,如果我有:

SomeBlock myBlock = ^(){};
[self.mutableArray addObject: [myBlock copy] ];
如果需要,请稍后:

[self.mutableArray removeAllObjects];
那么,我应该首先遍历数组中的所有块并释放它们中的每一个吗

谢谢

编辑:


我没有使用ARC,当我将一个块添加到数组中时,我在某处看到我需要复制它,这就是为什么我在将它添加到数组中时会执行
[block copy]
,因此我认为我应该在从数组中移除所有对象之前释放它们。

每当您获得任何对象的所有权时,释放它是您的职责,否则将发生内存泄漏

如果不释放指向该对象的指针,则将导致泄漏。 释放数组时,它将对所有对象调用release 因为它以前叫retain


对于ARC,它将处于自动释放状态,因此您需要释放自己。

我假设您没有使用ARC(那么这个问题就不有趣了)

在代码中,确实需要将
release
发送到所有块::虽然
NSArray
保留放置在其中的对象,并在释放数组本身时释放对象,但添加的对象已具有
1
的保留计数,因为
copy
方法为您提供了一个保留计数为
1
的对象。这就是为什么在将块添加到数组之前,需要使用
autorelease
执行
copy
,如下所示:

[self.mutableArray addObject: [[myBlock copy] autorelease]];

这个仪器显示什么?有泄漏吗?如果我做了
[[myBlock copy]autorelease]
,那么我可以只做
[self.mutableArray removeAllObjects]
,而不释放它的每个元素?@hzxu是的,这是正确的:
autorelease
将处理给复制块的
1
的初始引用计数,而
NSArray
将负责在块位于阵列内时保留块。