Почему этот объект является потенциальной утечкой? - PullRequest
0 голосов
/ 06 июня 2011

как я могу решить эту потенциальную утечку?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

NSUInteger row = [indexPath row];
Chapter *chapter =[Chapter alloc] ;

switch (indexPath.section) {
    case 0: 
        chapter = [einfuerung objectAtIndex:row];
        break;
    case 1: 
        chapter = [vertiefung objectAtIndex:row];
        break;
    case 2: 
        chapter = [spezial objectAtIndex:row];
        break;
}

if ([[NSFileManager defaultManager] fileExistsAtPath:[chapter urlOnFilesystem]]) {

    dataInstance.chapter = chapter;

    Container *container = [[Container alloc] init];
    [self.navigationController pushViewController:container animated:YES];
    [container release];
}
else{

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Kapitel nicht vorhanden" message:@"Kapitel wurde noch nicht heruntergeladen" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

[chapter release];

}

Xcode сообщает мне две проблемы с главой.

  1. Неправильное уменьшение счетчика ссылок объекта, которому на данный момент не принадлежит.
    Почему этот объект не принадлежит мне?

  2. Потенциальная утечка объекта .. (глава)
    Как правильно выпустить?
    [глава автоматического выпуска]]?

Ответы [ 3 ]

4 голосов
/ 06 июня 2011

Вы не должны размещать главу в приведенном ниже утверждении.

Chapter *chapter =[Chapter alloc] ;

Используйте ниже вместо.

 Chapter *chapter = nil;

Я изменил ваш код

NSUInteger row = [indexPath row];
 Chapter *chapter = nil;

switch (indexPath.section) {
    case 0: 
        chapter = [[einfuerung objectAtIndex:row] retain];
        break;
    case 1: 
        chapter = [[vertiefung objectAtIndex:row] retain];
        break;
    case 2: 
        chapter = [[spezial objectAtIndex:row] retain];
        break;
   default:
        chapter =[[Chapter alloc] init];
        break;
}

if ([[NSFileManager defaultManager] fileExistsAtPath:[chapter urlOnFilesystem]]) {

    dataInstance.chapter = chapter;

    Container *container = [[Container alloc] init];
    [self.navigationController pushViewController:container animated:YES];
    [container release];
}
else{

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Kapitel nicht vorhanden" message:@"Kapitel wurde noch nicht heruntergeladen" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
}

[chapter release];

}
3 голосов
/ 06 июня 2011
Chapter *chapter =[Chapter alloc];

Вы не отправили init, но это не является причиной утечки. Проблема в распределительном шкафу.

chapter = [einfuerung objectAtIndex:row];

Когда вы делаете это, вы указываете на новый объект chapter, и предыдущий выделенный объект просачивается. Если вы всегда получаете объект Chapter из массива (т. Е. У вас не более трех разделов), тогда вам не нужен alloc. Просто объявите об этом, и вам тоже не нужно выпускать.

0 голосов
/ 06 июня 2011

Сначала вы выделяете объект и присваиваете ему chapter. Вы забыли инициализировать его, но это не проблема.

Проблема возникает, когда вы перезаписываете chapter в своих операторах switch. Ссылка на ранее выделенный объект потеряна, и объект таким образом просочился.

Вам нужно сделать две вещи:

  1. Chapter *chapter = nil;
  2. Удалите [chapter release]; в конце, так как вы не являетесь владельцем элементов, возвращаемых [someArray objectAtIndex:row].
...