iOS:删除对象或在swift中重新初始化数组?

时间:2015-05-06 05:02:11

标签: ios swift nsmutablearray nsarray

我是swift的新手,我想知道重用数组的野兽方法是删除内部的所有对象还是重新初始化它。

例如,如果我有:

var my_array:NSMutableArray! //global variable

和我使用的第一种方法:

func firstMethod{
    my_array = NSMutableArray()
    my_array.addObject("one")
    my_array.addObject("two")
    my_array.addObject("three")
    ...
}

例如现在在另一个方法中我需要my_array为空:

最好的解决方案是:

func newmethod() {
    my_array = NSMutableArray() //reinitialize (drastic method)
    //here, all new operation with my_array
}

还是这个?:

func newmethod() {
    if my_array == nil{
        my_array = NSMutableArray()
    } else {
        my_array.removeAllObjects()
    }
}

2 个答案:

答案 0 :(得分:2)

一般答案是取决于。当涉及到可变的公共属性时,存在一个非常大的危险,特别是涉及多线程应用程序时。

如果您始终重新初始化,则更有可能避免多线程问题。

如果要清空阵列,则容易出现多线程问题。当您在一个线程上清空数组并尝试访问另一个线程上的任何索引时,您可能会在索引崩溃之类的情况下获得索引。

  

线程检查数组的计数。这是10.线程B清空了   阵列。数组的计数现在为0.线程A尝试访问对象   index 3.崩溃。

即使您的代码看起来很好,例如:

if array.count > 3 {
    array[3].doThings()
}

多线程意味着另一个线程在检查计数的代码和访问索引的代码之间改变数组。

我会尽可能选择不可变对象,并且我会避免改变可能以线程不安全方式访问的可变对象。

答案 1 :(得分:1)

为什么要重新初始化数组,不需要重新初始化它。如果重新初始化,那么它将指向另一个内存地址,因此最好在不重新初始化的情况下重用。你可以这样做

if (my_array == nil){
            my_array = NSMutableArray();
        }
        else{
            //my_array.removeAllObjects();
            // Do your stuff here
        }