NSUserDefault同步后访问不良

时间:2013-05-24 09:01:59

标签: objective-c uitableview nsuserdefaults

我有一些带有一些数据的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,然后应用程序崩溃。我不知道为什么。

一些想法?感谢。

4 个答案:

答案 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有关。尝试优化它。