0

我有一个 NSMutableArray 包含一大堆我创建并分配内存的 UITextField。

在我的 viewDidUnload 方法中,我需要释放这个内存。我该怎么做?

for(int i = 0; i < [arr count]; i++){
    UITextField* txtField = [arr objectAtIndex i];
    txtField = nil;
}
arr = nil;

这行得通吗?还是我只需要设置 arr = nil;?

我正在使用 ARC,所以我设置为 nil 不释放。

4

3 回答 3

1

如果数组是视图控制器的实例变量,只要您使用 ARC,它就会在视图控制器离开内存时自动释放。

如果需要手动删除数组,请将其设置为 nil。

arr = nil;

如果您以后需要重用该数组,则需要在将其设置为 nil 后重新分配它。

假设您的数组是对象的 @property,一个好的技巧是在 getter 中分配数组:

-(NSMutableArray*)arr {
    if (!_arr) {
        _arr = [[NSMutableArray alloc] init];
    }
    return _arr;
}

这样,当您尝试访问它时,您总是会得到一个数组,即使它以前被设置为 nil。

于 2013-07-16T02:57:37.183 回答
0

使用 ARC 时,您可以通过将变量设置为 nil 来释放变量,就像使用arr = nil. 请注意,只有当所有指向对象的指针都设置为 nil 时,才会释放内存,因此请确保您没有在其他任何地方持有它们。

其次,如果你遇到内存问题,你应该在didReceiveMemoryWarning方法中处理这个问题,因为 iOS 6 不再支持 viewDidUnload。

于 2013-07-16T02:56:21.253 回答
0

让我们看看你的代码做了什么来理解发生了什么:

UITextField* txtField = [arr objectAtIndex i];

它会复制数组中的值,而 an中的值NSMutableArray是引用,并将该值存储在 variabletxtField中。正如txtField所定义的那样,为了持有强引用,ARC 将(根据任何优化)在引用中注册所有权权益(也称为“保留”)。你的下一行:

txtField = nil;

将 nil 参考值存储在txtField. 由于txtField持有强引用,任何存储都会导致 ARC 放弃对存储在变量中的先前引用值的所有权权益(也称为“释放”)。

数组永远不会改变。你已经迭代了它的内容,复制了每个值,保留了那个值,释放了那个值。最后你写:

arr = nil;

它将 nil 参考值存储在arr. 由于arr持有强引用,任何存储都会导致 ARC 放弃存储在变量中的先前参考值的所有权权益(也称为“释放”) - 并且先前的值是您对NSMutableArray. 如果数组没有其他所有者,则将其销毁,并且当数组被销毁时,它会放弃其对其包含的任何值的所有权-在这种情况下是您的UITextField实例,如果没有其他所有者,则它们将被销毁...

所以你最多需要的是:

arr = nil

但你甚至可能不需要那个。Asarr在其生命周期结束时持有强引用 - 如果是局部变量,则在包含其声明的块或方法的末尾,或者如果实例变量,则当实例被销毁时 - 然后 ARC 将放弃其所有权权益,等等...

高温高压

于 2013-07-16T03:11:46.453 回答