2010-07-25 36 views
1

我有UIImageView裏面的分頁滾動視圖。 我需要刪除一些Imageviews以避免內存問題。removefromsuperview只是給出了錯誤

但是在任何時候我只是得到一個BAD_ACCESS。

for(UIView *subview in [scrollView subviews]) { 
    if([subview isKindOfClass:[UIImageView class]]) { 
    if (([subview tag] != ActualPage) && ([subview tag] != (ActualPage - 1)) && ([subview tag] != (ActualPage+1))) 
    { 
     [subview removeFromSuperview]; 
    } 
    } 
} 

基本上我想刪除除了實際頁面,一個回來和一個轉發的每個子視圖。

+0

我不確定,但它看起來像你試圖釋放迭代循環內的對象元素。您應該嘗試將所有相關的子視圖添加到數組中,然後再調用removeFromSuperview? – vodkhang 2010-07-25 13:46:22

回答

0

當你有一個碰撞,是有幫助的張貼回溯。崩潰是發生在該循環還是其他地方?

如果在顯示過程中該循環正在執行,那麼您違反了-removeFromSuperview的合約,該合約明確聲明不應在顯示過程中調用它。

我也可以想象一個崩潰導致subviews在枚舉中發生變異。

沒有回溯,無法確定地說。

一般來說,如果您的代碼使用isKindOfClass:表示這樣的行爲,那麼您應該重新審視一個設計古怪的設計。

1

從循環陣列中刪除對象不是一個好習慣。

嘗試將您想要從滾動視圖中移除的所有視圖添加到另一個數組,然後遍歷該數組中的所有項並在其上應用removeFromSuperView

您甚至可以使用makeObjectsPerformSelector而不是去在新陣列...

編輯
代碼示例:

NSMutableArray *viewsToRemove = [NSMutableArray array]; 
for (UIView *subview in [scrollView subviews]) { 
    if ([subview isKindOfClass:[UIImageView class]]) { 
     if (([subview tag] != ActualPage) && ([subview tag] != (ActualPage - 1)) && ([subview tag] != (ActualPage+1))) { 
      [viewsToRemove addObject:subview]; 
     } 
    } 
} 
[viewsToRemove makeObjectsPerformSelector:@selector(removeFromSuperView)]; 
+0

謝謝。 你可以用makeObjectsPerformSelector提供一個小例子嗎? 我發現的所有內容都適用於所有子視圖。 – Alex 2010-07-25 14:13:41

+0

我編輯了我的答案... – 2010-07-25 20:33:18