2014-11-04 142 views
2

我使用的方法与循环中:崩溃时在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

很难说不知道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情况下,那么我会解决在调用这个函数的代码的问题,使用快捷数组,而不是NSArray,所以避免投的问题,当然这取决于从你的实际代码 - 所以这不是一个解决方案,可以在任何情况下工作。

更新该解决方案还更好地能够解决您的问题,如果真的发生了,你有混合类型的元素的数组,但您有兴趣处理只为MyObject类型的:

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

区别在于,不是试图转换整个数组,而是为每个元素尝试转换。

+0

谢谢!首先检查解决了我的问题。 – edzio27 2014-11-04 09:56:48

+1

很高兴知道。但是,即使它修复了崩溃问题,其他地方也可能存在错误,因为您期望包含某种类型元素的数组。看看更新的答案。 – Antonio 2014-11-04 10:16:30