释放对象时出错

时间:2010-08-22 15:13:17

标签: iphone objective-c

-(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我也试图保留对象但不缺。

2 个答案:

答案 0 :(得分:2)

您在此处分配对象:

temp = [[NSMutableArray alloc]init];

然后立即用NSKeyedUnarchiver返回的差异对象替换它:

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

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

答案 1 :(得分:0)

你在这里创造了两次“临时”。首先你要分配/初始化它,在这种情况下,释放是有意义的。但随后该实例被丢弃,并替换为[decoder decodeObjectForKey:@“m_originalArray”]的返回值。该新实例是自动释放的,因此当您手动释放它时,当自动释放池耗尽时,您将其设置为崩溃。只需摆脱第一个任务和匹配的释放,你就不会泄漏或崩溃。