包含的对象上的NSMutableArray EXC_BAD_ACCESS

问题描述:

我有一个类,我实现了一个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

- (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

乔吹说,这是错误的:

- (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代码,修复它识别的任何问题。如果它仍然崩溃,发布崩溃的回溯