仅在释放模式下将对象内部转换为for循环时崩溃

时间:2014-11-04 09:25:22

标签: swift nsmutablearray nsarray xcode6.1 ios8.1

我在for循环中使用方法:

func filter (array: NSArray) -> NSMutableArray {
    var filteredArray: NSMutableArray = NSMutableArray()
    for objects in array as [MyObject] { // this line crash only on release mode
        // TODO
    }
    return filteredArray
}

当它处于调试模式时它工作正常,但是当我改为发布模式时它就崩溃了:

for objects in array as [MyObject]{

当我将方法更改为此方法(不在内部循环中)时,它也不会在发布模式下调试时崩溃:

func filter (array: [MyObject]) -> NSMutableArray {
    var filteredArray: NSMutableArray = NSMutableArray()
    for objects in array {
        // TODO
    }
    return filteredArray
}

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:1)

很难说不知道NSArray里面究竟是什么。我建议设置一个断点并检查array变量的内容。

但是,原因是as运算符无法执行强制转换,因为array中的至少一个元素不是MyObject的(子类)的实例。我会通过使用可选的强制转换来保护该代码,但如果强制转换失败则会跳过整个for循环。

func filter (array: NSArray) -> NSMutableArray {
    var filteredArray: NSMutableArray = NSMutableArray()
    if let array = array as? [MyObject] {
        for objects in array as [MyObject] { // this line crash only on release mode
            // TODO
        }
    }
    return filteredArray
}

如果您确定该数组包含MyObject个实例,那么我将使用swift数组而不是NSArray来解决调用此函数的代码中的问题,从而避免出现转换问题,但是当然这取决于你的实际代码 - 所以这不是一个可能适用于所有情况的解决方案。

更新此解决方案还可以更好地解决您的问题,如果您的阵列中包含混合类型的元素,但您只想处理MyObject类型的数据:

func filter (array: NSArray) -> NSMutableArray {
    var filteredArray: NSMutableArray = NSMutableArray()
    for element in array {
        if let element = element as? MyObject {
            // TODO
        }
    }
    return filteredArray
}

不同之处在于,不是试图强制转换整个数组,而是尝试对每个元素进行强制转换。