让我们看看你的代码做了什么来理解发生了什么:
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 将放弃其所有权权益,等等...
高温高压