2010-08-22 3 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, я не могу понять, почему? Я выделяю объект temp, тогда я добавляю все объекты в массиве temp к m_OriginalArray, который также пытался сохранить объекты, но не имел недостатка.Ошибка при отпускании объекта

ответ

0

Здесь вы создаете «темп». Сначала вы выделяете/инициализируете его, и в этом случае релиз имеет смысл. Но тогда этот экземпляр отбрасывается и заменяется возвращаемым значением из [decoder decodeObjectForKey: @ "m_originalArray"]. Этот новый экземпляр автореализован, и поэтому, когда вы выпускаете его вручную, вы устанавливаете его для сбоя, когда пул авторекламы сливается. Просто избавитесь от первого задания и соответствующего выпуска, и вы не будете просачиваться или терпеть крах.

+0

спасибо за помощь, в которой он работает. – Amir

2

Вы выделяете объект здесь:

temp = [[NSMutableArray alloc]init]; 

, но затем сразу же заменить его разностный объект, возвращенные из NSKeyedUnarchiver:

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

Новый объект будет autoreleased, поэтому нет никакой необходимости чтобы освободить его. Вы можете просто удалить первую строку (NSMutableArray alloc & init one) полностью, так как вы не используете этот объект.

+0

спасибо за помощь, в которой он работает. – Amir

Смежные вопросы