Objective-C Badbox dropbox исключения - PullRequest
0 голосов
/ 24 января 2012

У меня есть вопрос. Где причина EXC_BAD_ACCESS в следующем коде?

-(void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)metadata {
    if(metadata.isDirectory) {
        db_Path = metadata.path;
        int i = 0;
        NSString *fileName = [[NSString alloc] init];
        for(DBMetadata *file in metadata.contents) {
            fileName = [NSString stringWithFormat:@"%@", file.filename];
            [db_MetaFileNames addObject:file.filename];
            i++;
        }
        [self createMetaListArray];   
        [fileName release];                   
    }
}

-(void)createMetaListArray {
    fileNamesAtDirectory = db_MetaFileNames;
    for (int i=0; i < [fileNamesAtDirectory count]; i++) {
        NSString *filePathWithName = db_directory;

        [filePathWithName stringByAppendingFormat:
            [fileNamesAtDirectory objectAtIndex:i]];

        [filePathsAtDirectory addObject:filePathWithName];
        [filePathWithName release];
   }
}

Может ли кто-нибудь здесь помочь мне?

1 Ответ

1 голос
/ 24 января 2012

Здесь:

NSString *fileName = [[NSString alloc] init];
for(DBMetadata *file in metadata.contents) {
  fileName = [NSString stringWithFormat:@"%@", file.filename]; 

NSString в первой строке перезаписывается новыми значениями в третьей строке. Исходное значение утечки.

Это означает, что:

}
[self createMetaListArray];
[fileName release];   

Релиз в последней строке высвобождает не fileName, который вы указали / инициализировали выше, а присваивание внутри цикла. Вы не распределяете / не копируете / не сохраняете это, поэтому вы не «ответственны» за его освобождение.

У вас есть подобное недоразумение во второй функции.

[filePathWithName stringByAppendingFormat:[fileNamesAtDirectory objectAtIndex:i]];

Это не меняет filePathWithName. Возвращает новую строку.

Я предлагаю вам ознакомиться с правилами управления памятью Какао - вам не хватает некоторых основ. Понимание этого сделает вашу жизнь намного проще.

...