gpt4 book ai didi

swift - 仅在 Release模式下在 for 循环内转换对象时崩溃

转载 作者:可可西里 更新时间:2023-11-01 02:27:25 25 4
gpt4 key购买 nike

我在内部使用带有 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
}

当它是 Debug模式时它工作正常,但是当我切换到 Release模式时它在线崩溃了:

for objects in array as [MyObject]{

当我将方法更改为这个方法时(没有在循环内转换)它不会在调试时崩溃,在 Release模式下也不会崩溃:

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

有人能解释一下为什么吗?

最佳答案

如果不知道 NSArray 中到底有什么,很难说。我建议设置断点并检查 array 变量的内容。

但是,原因是 as 运算符无法进行强制转换,因为 array 中至少有一个元素不是 (的子类)的实例>我的对象。我会通过使用可选的强制转换来保护该代码,尽管如果强制转换失败会跳过整个 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
}

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

关于swift - 仅在 Release模式下在 for 循环内转换对象时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com