如何安全地清理复杂的NSMutableArrray?

时间:2016-01-20 02:23:21

标签: ios objective-c nsmutablearray

我有一个mutableArray(数组),element是一个字典(item),每个项目都有两个键,一个指向一个字典,另一个指向一个mutableArray(subArray)。

问题是:使用数组后,我应该清理它。 我应该这样做:[array removeAllObjects]; 或者我需要迭代数组来调用:[subArray removeAllObjects];

换句话说,红色框中的代码是否必要?

enter image description here

5 个答案:

答案 0 :(得分:1)

+ (void)clearShoppingCart {
    [carItems removeAllObjects];
}

像Gerd说的那样。应用程序不会崩溃。

答案 1 :(得分:0)

for (NSMutableDictionary *dic in cartItems) {
    [dic[@"products"] removeAllObjects];
}
[cartItems removeAllObjects];

[cartItems removeAllObjects];

两个代码后:结果将

  

cartItems是空字典

答案 2 :(得分:0)

您只需要释放cartItems对象,最终将清除所有内容。

self.cartItems = nil

答案 3 :(得分:0)

如果$row_array= array(); while ($row = mysqli_fetch_assoc($result)) { $tmp = array(); $tmp['title'] = $row['title']; $tmp['year'] = $row['year']; $tmp['author'] = $row['author']; $tmp['journal'] = $row['journal']; $tmp['keywords'] = $row['keywords']; $tmp['abstract'] = $row['abstract']; $tmp['url'] = $row['url']; $row_array[] = $tmp; } echo '{"data":'; echo json_encode($row_array); echo '}'; 不归其他实例所有,则dic[@"products"]足以删除所有内容。

但是,如果[cartItems removeAllObjects]由另一个实例拥有。例如,

dic[@"products"]

答案 4 :(得分:0)

编辑:也许我有点心烦意乱。 红色框中的代码不是必需的。 removeAllObject甚至self.cartItems = @ []也没关系。

我怀疑这种清理是否必要。

我想说这取决于所包含对象的引用计数。比如,@ [A,B,C],是否有指向A,B或C的指针?

  

首先,我想提醒ARC在Objective-c的基础上工作   对象的引用计数。如果计数变为0,它将是   dealloc很快。

让我们把它分解成案例, let container = Array或Dictionary。

  1. 只有容器强力保持对象:对于@ [A,B,C] / @ {@“a”:A}。如果没有更强的指针指向容器,则数组将很快被释放。容器对物体的强烈指向将被取消。由于没有更强烈的指向A,B,C。他们的计数变为零,他们也将被dealloc。
  2. 在您的情况下,如果self.cartItems指向的数组(例如,X)仅由self.cartItems指向。当你的self.cartItems = nil,因为没有更多的指针指向X,X将dealloc,如果它满足“只有容器强持对象”,则会出现情况1

    1. 如果不仅仅是容器强持对象:它会像case1一样处理,但是,如果A和C如果指向另一个指针,当容器dealloc时,B将是dealloc,但A和C不会如同仍然是强有力的。
    2. 在你的情况下,

      self.cartItems = @[A, B, C];
      self.specialCartItem = A;
      self.discountCartItem = C;
      
      self.cartItems = nil
      

      A和C仍然会在这里。至少你将self.specialCartItem和self.discountCartItem设置为nil;

      因此,您可以预见它是否是嵌套容器。它只是在递归的基础上工作。

      关键是没有其他侧强指针指向容器和对象。我会得出结论,你只需要使用你使用的每个指针。它应该没问题。

      如果我错了,请纠正我。