我有一些带有一些数据的UITableView。每个单元格都有一个按钮,如果按下它,则删除所选的单元格。之后我必须使用NSUserDefault保存我的数据。这里有一些代码:
- (void)buttonPressed:(UIButton *)sender{
int tag=sender.tag;
[myArray removeObjectAtIndex:tag];
[self saveData];
[self.myTableView reloadData];
}
buttonPressed
方法调用saveData
方法:
-(void)saveData{
dataString=[[NSString alloc]init]; //defined in .h file
for(int i=0; i<([myArray count]); i++){
ClassObject *aObject=[[ClassObject alloc]init];
aObject=[myArray objectAtIndex:i];
dataString=[dataString stringByAppendingString:aObject.idObject];
dataString=[dataString stringByAppendingString:@"$"];
dataString=[dataString stringByAppendingString:aObject.description1];
dataString=[dataString stringByAppendingString:@"$"];
dataString=[dataString stringByAppendingString:aObject.description2];
dataString=[dataString stringByAppendingString:@"?"];
[aObject release];
}
NSUserDefaults *dataDefault=[NSUserDefaults standardUserDefaults];
[dataDefault setObject:dataString forKey:@"myDataString"];
[dataDefault synchronize];
[dataString release];
}
在调试模式下一切正常,直到saveData
方法结束。当它结束时调试返回buttonPressed
方法,它重新加载tableview,然后应用程序崩溃。我不知道为什么。
一些想法?感谢。
答案 0 :(得分:1)
aEquipaggio
应用中saveData
来自哪里?为什么要在循环的每次迭代中释放它?这没有任何意义,它很可能过度释放,导致崩溃。
编辑:既然您更改了问题中的代码,aEquipaggio
已不再存在,但循环结束时的release
仍然不正确,循环中的第一行完全没有意义(和泄漏)因为你从不使用你分配的ClassObject
实例。
您也不应该在方法结束时发布dataString
。此时,dataString
不再包含您在开始时alloc
- init
编辑的相同实例,因为您已在循环中将其替换为自动释放的实例。 ([[NSString alloc]init]
无论如何都是毫无意义的,只需使用@""
)。
答案 1 :(得分:1)
ClassObject *aObject=[[ClassObject alloc]init];
aObject=[arrayEquipaggio objectAtIndex:i];
// ...
[aObject release];
Firstly, and most importantly, it's rather anObject
.
其次,这会泄漏内存(当您将[arrayEquipaggio objectAtIndex:i];
重新分配给变量时,会丢失指向已分配实例的指针)和过度释放aObject
(其中现在,正如我刚才解释的那样,指向数组中的一个对象,所以你要发布一个你不拥有的对象。)
总而言之,删除带有alloc-init的行和带有release的行(你也使用dataString
变量犯了同样的错误)并且:
Read this before continuing with development! 否则,在Objective-C中执行任何操作都会遇到严重问题。目前,您似乎不知道内存管理的工作原理。 (在尝试使用Objective-C之前学习C也是值得的,但遗憾的是,结果却太大了......)
答案 2 :(得分:1)
你的内存分配错了。这就是你正在做的事情:
dataString = [[NSString alloc] init];
dataString = [dataString stringByAppendingString:@"$"];
[dataString release];
首先,您需要分配一个必须稍后发布的新字符串。没关系。然后将不同的指针存储到dataString
变量中,泄漏前一个字符串。然后你释放由-stringByAppendingString
创建的自动释放的字符串,以便在此之后对象很快被释放。
答案 3 :(得分:0)
一个疯狂的猜测,也许它与释放dataString
有关。尝试优化它。