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

iOS: remove objects or reinitialize arrays in swift?

我是 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()
    }
}

为什么要重新初始化数组不需要重新初始化it.And如果重新初始化它会指向另一个内存地址所以最好重用而不重新初始化。你可以这样做

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

一般答案是这取决于。当涉及到具有可变 public 属性时,尤其是当涉及到多线程应用程序时,确实存在很大的危险。

如果您总是重新初始化,则更有可能不会出现多线程问题。

如果你清空数组,你很容易出现多线程问题。当您在一个线程上清空数组并尝试在另一个线程上访问 any 索引时,您可能会遇到索引越界崩溃等情况。

Thread A check's the array's count. It's 10. Thread B empties the array. Array's count is now 0. Thread A tries to access an object at index 3. Crash.

即使您的代码看起来不错,也可能是这样的:

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

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

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