2013-07-16 32 views
0

我有一个NSMutableArray,它包含了我创建并分配了内存的一大堆UITextFields。设置NSMutableArray中的元素为零

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

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

这项工作?或者我只需要设置arr = nil;?

我使用ARC,所以我设置为零,无法释放。

回答

0

让我们看看你的代码不明白发生了什么什么:

UITextField* txtField = [arr objectAtIndex i]; 

,使一个复制数组中的价值,并在NSMutableArray值是引用,并存储在一个变量值txtField。由于txtField被隐含地定义为保留强引用,ARC将(根据任何优化)在引用(也称为“保留”)中注册所有权权益。您的下一行:

txtField = nil; 

存储零参考值txtField。由于txtField拥有强有力的参考,任何商店都会导致ARC放弃存储在变量中的以前参考值中的所有权利益(又名“发行版”)。

该数组从未改变。您已经遍历其内容,复制每个值,保留该值,并释放该值。最后你写:

arr = nil; 

它存储零参考值在arr。由于arr拥有强大的参考价值,因此任何商店都会导致ARC放弃存储在变量中的以前参考值中的所有权利益(又称“发布”),并且以前的值是您对NSMutableArray的参考。如果数组中没有其他所有者,则它将被销毁,并且当数组被销毁时,它将放弃它所包含的任何值的所有权 - 在这种情况下,这是您的UITextField实例,并且如果没有其他所有者,那么它们是摧毁...

所以顶多你需要的是:

arr = nil 

但你可能甚至不需要说。由于arr在其生命周期结束时保留强引用 - 在包含其声明的块或方法结束时(如果是局部变量),或者实例在实例变量被销毁时 - 那么ARC将放弃其所有权利益等等。

HTH

+0

好的。这就说得通了。 感谢您的帮助。 – user1087185

0

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

其次,如果你正在运行到内存问题,你应该在didReceiveMemoryWarning方法来处理这一点,因为viewDidUnload不再支持iOS 6.

+0

好的。所以从ios 6我使用didReceiveMemoryWarning释放任何东西,而不是viewDidUnload? – user1087185

+0

如上面jb_OH所述,视图控制器从导航堆栈弹出时,视图控制器的所有属性都将被释放。如果出现内存不足错误,则只需手动发布。如果内存不足,则应该在didReceiveMemoryWarning中处理释放对象。您可以在iOS 5和iOS 6上执行此操作,并且为了保持一致性,我会推荐您。 –

1

如果阵列是视图控制器的一个实例变量,如只要您使用ARC,它将在视图控制器离开内存时自动解除分配。

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

arr = nil; 

如果您以后需要重新使用该阵列,则需要在将其设置为nil后重新分配该阵列。

假设你的数组是你的对象的@property,一个好的技巧是在阵列中,吸气分配:

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

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

+0

arr是viewController的一个属性。 所以我不需要=无我分配的任何弧线?一旦控制器离开内存,它们会自动释放,所以当我更改视图控制器时? – user1087185

+0

正确,这是ARC的一大优点之一。在过去,你必须释放和释放对象。现在它已经为你完成了。 –

+0

这很棒。 感谢您的帮助。 – user1087185