包含的对象上的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 :|
}
答
- (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++;
}
}
答
乔吹说,这是错误的:
- (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
代码,修复它识别的任何问题。如果它仍然崩溃,发布崩溃的回溯
@Joe - 你是对的,没有 '可能是' 它。如果您创建或保留按钮,则不应在此处发布。 – hooleyhoop 2011-03-20 09:56:54
@PARTH我该怎么做? – Andrea 2011-03-20 11:18:03