Что такое «потенциальные утечки» в Xcode и можно ли их игнорировать? - PullRequest
1 голос
/ 07 декабря 2011

Я использую опцию меню «проанализировать» из Xcode 4.2, и у меня есть три «потенциальных утечки».Что такое «потенциальная утечка» ??

Когда я собираю и запускаю приложение, все работает нормально.Когда я использую инструмент «утечки», ни одна из этих трех частей кода не обнаруживает утечки.Так можно ли просто игнорировать эти «потенциальные утечки»?

Три раздела кода, которые содержат «потенциальные утечки», (обратите внимание, что это не последовательные блоки кода, а находятся в разных файлах) ...

Первый ...

- (void)DoDomainCheck {
AppDelegate *dataCentre = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSString *queryStringFull = [queryStringFirst stringByAppendingString:dataCentre.DomainCheckData];
labeltocheck.text = dataCentre.DomainCheckData;

responseData = [NSMutableData new];
NSURL *url = [NSURL URLWithString:@"http://www.myurl.com/whois.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSData *requestData = [queryStringFull dataUsingEncoding:NSUTF8StringEncoding];

[request setHTTPMethod:@"POST"];
[request setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody: requestData];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

Второй ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
cell.detailTextLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];

[cell.textLabel setLineBreakMode:UILineBreakModeWordWrap];
[cell.textLabel setNumberOfLines:0];
[cell.textLabel sizeToFit];

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

Третий ...

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"item"]) {
    [item setObject:currentImage forKey:@"media"];
    [item setObject:currentTitle forKey:@"title"];
    [item setObject:currentLink forKey:@"link"];
    [item setObject:currentSummary forKey:@"summary"];
    [item setObject:currentDate forKey:@"date"];
    [stories addObject:[item copy]];
}
}

Может кто-нибудь увидеть какие-либо очевидные проблемыс этими разделами кода, или я могу просто игнорировать эти «потенциальные» утечки?

Ответы [ 4 ]

2 голосов
/ 07 декабря 2011

в анализаторе щелкните на индикаторах стрелок, чтобы увидеть путь в коде, который создает потенциальную утечку.

Часть 1: для автоматически выпущенного ответаДанные используются:

responseData = [NSMutableData data];

[[NSURLConnection alloc] initWithRequest:request delegate:self];

и NSURLConnectionвыделено

Часть 2: См. ответ @Bill Bransky

Часть 3:

[Stories addObject: [item copy]];

Thecopy не требуется, это увеличивает счетчик ссылок, а addObject также увеличивает счетчик ссылок.Когда объект stories выпущен, релиз будет отправлен каждому его элементу, но все равно будет дополнительный счетчик ссылок из copy.

О copy, когда при написании кода всегда известнопочему написано каждое утверждение и часть заявления.Если сомневаетесь, исследуйте.Добавление кода без ведома точно приведет к тому, что он «работает по совпадению», будет хрупким и, вероятно, вызовет проблемы позже.

Это действительно поможет вам изучить документы Apple по управлению памятью.Также настоятельно рекомендуем ARC.

В ответ на ваш вопрос утечки не вызывают сбои, но используют память, и это может быть проблемой.

0 голосов
/ 07 декабря 2011

Вы должны устранить эти потенциальные утечки. Сосредоточьтесь на распределении объектов и освобождении.

0 голосов
/ 07 декабря 2011

Эта строка:

[[NSURLConnection alloc] initWithRequest:request delegate:self];

, так как последняя строка перед концом тела метода выглядит для меня утечкой - вы выделяете объект с помощью метода "init", который по соглашению возвращает сохраненный объект без сохранения ссылки на объект в иваре .

0 голосов
/ 07 декабря 2011

Я думаю, что что-то было неправильно скопировано / вставлено в первой части. У вас есть NSURLConnection alloc / init. Не говорит, что вы инициируете это в. Но что бы это ни было, оно должно быть выпущено, когда сделано.

Часть 2, необходимо настроить ячейку для автоматического освобождения. Будет исправить вашу потенциальную утечку там.

Часть 3, вы добавляете сохраняемый элемент вместе с [копией элемента]. Это приведет к утечке предмета. Может потребоваться переосмыслить, как у вас это настроено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...