2014-11-04 121 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