【问题标题】:iOS: remove objects or reinitialize arrays in swift?iOS:快速删除对象或重新初始化数组?
【发布时间】:2015-05-06 05:02:11
【问题描述】:

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

【问题讨论】:

  • 无需重新初始化阵列。您可以删除旧对象并使用此数组添加新对象。所以第二种方法在你的情况下工作正常。

标签: ios swift nsmutablearray nsarray


【解决方案1】:

一般的答案是视情况而定。拥有可变的公共属性确实存在重大危险,尤其是在涉及多线程应用程序时。

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

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

线程 A 检查数组的计数。现在是 10。线程 B 清空 大批。数组的计数现在为 0。线程 A 尝试访问一个对象 index 3. 崩溃。

尽管您的代码看起来不错,但类似这样:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,谢谢,我在 obj-c 中做了这个,但我不知道在 swift 中是否相同......但没关系,谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 2017-07-11
    • 2020-07-15
    • 1970-01-01
    • 2013-01-17
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多