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
将负责在块位于阵列内时保留块。