Objective c 将NSMutableArray中的元素设置为nil

Objective c 将NSMutableArray中的元素设置为nil,objective-c,memory-management,automatic-ref-counting,Objective C,Memory Management,Automatic Ref Counting,我有一个NSMutableArray,它包含我创建并分配内存的一大堆UITextFields 在viewDidUnload方法中,我需要释放此内存。我该怎么做 for(int i = 0; i < [arr count]; i++){ UITextField* txtField = [arr objectAtIndex i]; txtField = nil; } arr = nil; for(int i=0;i

我有一个NSMutableArray,它包含我创建并分配内存的一大堆UITextFields

在viewDidUnload方法中,我需要释放此内存。我该怎么做

for(int i = 0; i < [arr count]; i++){
    UITextField* txtField = [arr objectAtIndex i];
    txtField = nil;
}
arr = nil;
for(int i=0;i<[arr count];i++){
UITextField*txtField=[arr objectAtIndex i];
txtField=nil;
}
arr=nil;
这样行吗?或者我只需要设置arr=nil


我正在使用ARC,所以我将其设置为nil而不是release。

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


其次,如果遇到内存问题,您应该使用
didReceiveMemoryWarning
方法来处理,因为iOS 6不再支持viewDidUnload

如果数组是视图控制器的实例变量,只要您使用ARC,当视图控制器离开内存时,它将自动解除分配

如果需要手动删除阵列,请将其设置为nil

arr = nil;
如果以后需要重用该阵列,则需要在将其设置为nil后重新分配它

arr = nil;
假设数组是对象的@属性,一个好方法是在getter中分配数组:

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

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

让我们看看您的代码如何理解发生了什么:

UITextField* txtField = [arr objectAtIndex i];
它复制数组中的值,而
NSMutableArray
中的值是引用,并将该值存储在变量
txtField
中。由于
txtField
被隐式定义为持有强引用,ARC将(根据任何优化)在引用中登记所有权权益(也称为“保留”)。您的下一行:

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

数组永远不会更改。您迭代了它的内容,复制了每个值,保留了该值,发布了该值。最后你写道:

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

因此,您最多只需要:

arr = nil
但你可能根本不需要这个。As
arr
在其生命周期结束时持有强引用—如果是局部变量,则在包含其声明的块或方法结束时;如果是实例变量,则在实例被销毁时—ARC将放弃其所有权权益,等等


HTH

arr是viewController的一个属性。所以我不需要=零我在arc中分配的任何东西?一旦控制器离开内存,它们就会自动释放,所以当我更改视图控制器时?没错,这是ARC的一大好处。在过去,您必须释放和解除锁定对象。现在一切都为你准备好了,太棒了。谢谢你的帮助。顺便说一句-如果你通过导航更改视图控制器,你的VC只会在“返回”导航期间从内存中删除。前向导航会将VC保存在内存中。假设我要这样做:[自我呈现Modalviewcontroller:view animated:true];这会从内存中释放控制器吗?或者我该如何从记忆中释放它?好的。因此,在ios 6中,我使用didReceiveMemoryWarning来释放任何内容,而不是viewDidUnload?正如上面所说,当视图控制器从导航堆栈中弹出时,视图控制器的所有属性都将被释放。如果内存不足,只需手动释放。如果内存不足,应在didReceiveMemoryWarning中处理释放对象。您可以在iOS 5和iOS 6上执行此操作,为了保持一致性,我建议您这样做。好的。这是有道理的。谢谢你的帮助。