2010-08-22 176 views
0
-(void)LoadOriginalListFromFile 
{ 

NSMutableArray *temp; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"shopes.dat"]; 
//2.check if file exists 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
if([fileManager fileExistsAtPath:path]) 
{ 
    //open it and read it 
    NSLog(@"shopes.dat file found. reading into memory"); 
    NSMutableData *theData; 
    NSKeyedUnarchiver *decoder; 
    //3. decode the file into memory 
    theData = [NSData dataWithContentsOfFile:path]; 
    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:theData]; 
    temp = [[NSMutableArray alloc]init]; 
    temp = [decoder decodeObjectForKey:@"m_OriginalArray"]; 

    //4. add object to original list 
    NSEnumerator *enumerator = [temp objectEnumerator]; 
    id anObject; 

    while (anObject = [enumerator nextObject]) 
    { 

     [m_OriginalArray addObject:anObject]; 
    } 

    //[temp release]; // here is the problem!!!!! 
    [decoder finishDecoding]; 
    [decoder release]; 

} 
else 
{ 
    NSLog(@"shopes.dat file not found"); 
} 

} 

我对temp对象有问题。 我想要做的是在函数结束前释放对象,但如果我这样做,当应用程序启动时,我得到ERROR_BAD_ACSS,我不明白为什么? 我分配临时对象,然后我将临时数组中的所有对象添加到我的m_OriginalArray我也尝试保留对象,但不缺乏。释放对象时出错

回答

0

您在此处创建“temp”两次。首先你要分配/初始化它,在这种情况下,释放是有意义的。但是,那么该实例将被丢弃,并由[decoder decodeObjectForKey:@“m_originalArray”]的返回值替换。这个新实例是自动发布的,所以当你手动发布它的时候,你会在autorelease池耗尽时设置它来崩溃。简单地摆脱第一项任务和匹配版本,并且不会泄漏或崩溃。

+0

感谢您的帮助。 – Amir 2010-08-23 06:24:04

2

你在这里分配对象:

temp = [[NSMutableArray alloc]init]; 

但随后立即有区别对象取代它从NSKeyedUnarchiver返回:

temp = [decoder decodeObjectForKey:@"m_OriginalArray"]; 

新对象将被自动释放,因此没有必要释放它。您可以完全删除第一行(NSMutableArray alloc & init),因为您没有使用该对象。

+0

感谢您的帮助。 – Amir 2010-08-23 06:24:40