2011-03-20 55 views
1

我有一個類,我實現了一個NSMutableArray對象。現在,當手機進入橫向模式時,NSMutableArray中的所有對象都將從視圖中刪除(但不是從NSMutableArray中刪除),然後當手機返回到縱向模式時,我將包含在NSMutableArray中的所有對象該視圖,但是當我嘗試訪問我收到的第一個對象時:EXC_BAD_ACCESS。包含的對象上的NSMutableArray EXC_BAD_ACCESS

這是我的代碼:

- (void) setObjects:(BOOL)hidden andWindow:(UIWindow *)win andTxt:(UITextView *)txt andTarget:(id) target { 
    //view 
    key = [win.subviews objectAtIndex:0]; 
    key.hidden = hidden; 
    buttons = [[NSMutableArray alloc] initWithCapacity:1]; //my array 
    txtsms = txt; 
     [...] 
} 

- (void) addButton:(button *)but { 
    [key addSubview:[but returnButton]]; 
    [buttons addObject:but]; 
    [but release]; 
} 

- (void) hiddenAllKey { 
    for (UIView *subview in [key subviews]) 
     if ((subview.tag <= startSpecialPunctuation+1)&&(subview.tag >= spaceButton+1)) 
      [subview removeFromSuperview]; 
} 

- (void) showAllKey { 
    for(int i = 0; i < [buttons count]; ++i) 
      [key addSubview:[[buttons objectAtIndex:i] returnButton]]; //this is the problem :| 
} 
+0

@Joe - 你是對的,沒有 '可能是' 它。如果您創建或保留按鈕,則不應在此處發佈。 – hooleyhoop 2011-03-20 09:56:54

+0

@PARTH我該怎麼做? – Andrea 2011-03-20 11:18:03

回答

1
- (void) hiddenAllKey { 
    for (UIView *subview in [key subviews]) 
     if ((subview.tag <= startSpecialPunctuation+1)&&(subview.tag >= spaceButton+1)) 
      [subview removeFromSuperview]; 
} 

這也是錯誤的。您正在使用快速枚舉從正在枚舉的列表中刪除元素。它可以(應該)容易失敗。

此前,我已經寫了一個關於UIView的類來做一個全部刪除操作,可以通過一個簡單的while循環來實現。現在,你正在嘗試做什麼...你可能會做一個for循環,你自己管理迭代索引,也就是說,當你不刪除,增加,否則你保持不變。

編輯:解建議:

for (int idx = 0; idx < [[key subviews] count];) 
{ 
    UIView *subview = [[key subviews] objectAtIndex: idx]; 
    if ((subview.tag <= startSpecialPunctuation + 1) && (subview.tag >= spaceButton + 1)) 
    { 
     [subview removeFromSuperview]; 
    } 
    else 
    { 
     idx++; 
    } 
} 
+0

你能把我的解決方案連接到我嗎? – Andrea 2011-03-22 10:30:53

+0

我會用* your *的可能解決方案來編輯​​我的答案,這不是我在我的案例中所做的。 – jv42 2011-03-22 10:52:33

+0

謝謝,但是我測試了這段代碼,並且不起作用:| – Andrea 2011-03-22 14:25:53

3

喬吹說,這是錯誤的:

- (void) addButton:(button *)but { 
    [key addSubview:[but returnButton]]; 
    [buttons addObject:but]; 
    [but release]; 
} 

but不應該在該方法被釋放。同樣,這種罷工恐懼在我的心臟:

- (void) setObjects:(BOOL)hidden andWindow:(UIWindow *)win andTxt:(UITextView *)txt andTarget:(id) target { 
    //view 
    key = [win.subviews objectAtIndex:0]; 
    key.hidden = hidden; 
    buttons = [[NSMutableArray alloc] initWithCapacity:1]; //my array 

你在哪裏釋放buttons?你的應用程序是否曾經只調用過該方法?如果沒有,那麼你會漏出buttons

嘗試使用build and analyze代碼,修復它識別的任何問題。如果它仍然崩潰,發佈崩潰的回溯