Проблемы с поиском утечки памяти - PullRequest
0 голосов
/ 08 октября 2009

Привет всем, у меня проблемы с поиском утечки памяти. все мои подсчеты сохраняются = 0, когда я их освобождаю, но все же я отмечаю утечку из следующего бита кода:

- (GKSession *) peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
inSession = [[GKSession alloc] initWithSessionID:gameSessionID displayName:nil sessionMode:GKSessionModePeer];
printf( "insession alloc on Start: %i\n", [inSession retainCount] );
return inSession;

}

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

- (void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker { 
picker.delegate = nil;
mpicker.delegate = nil;
inSession.delegate = nil;
gameSession.delegate = nil;

if(inSession != nil) {

    [self invalidateSession:inSession];
    [inSession release];
    inSession = nil;

}

[picker release];

picker = nil;
mpicker = nil;



[inSession release];


if(self.gameSession != nil) {
    [self invalidateSession:self.gameSession];
    [self.gameSession release];
    self.gameSession = nil;
}

[self.gameSession release];
self.gameLabel.hidden = NO;
self.gameState = pongStateStartGame;


[gameSession release];
[inSession release];

[inSession dealloc];
[gameSession dealloc];



[mpicker dealloc];

}

Где-то код протекает, и я не могу понять, где я живу. Любая помощь с этим была бы удивительно оценена.

Ответы [ 5 ]

3 голосов
/ 08 октября 2009

Используйте Инструменты , чтобы найти утечки.

Проблема в том, что вы еще не поняли управление памятью в Cocoa .

[inSession dealloc];
[gameSession dealloc];
[mpicker dealloc];

Вы не должны никогда звонить -dealloc самостоятельно. NSObject вызывает это, когда счетчик ссылок достигает 0.

Попробуйте узнать, как правильно управлять памятью.

2 голосов
/ 08 октября 2009

Рассмотрите возможность запуска Xcode 3.2 Build and Analyze (в меню Build). Это может быть очень полезно при поиске проблем с подсчетом ссылок.

Если это не помогает, запустите инструмент «Утечки» в «Инструментах» («Выполнить» - «Выполнить с помощью инструмента повышения производительности» -> «Утечки»).

0 голосов
/ 11 августа 2010

Просто комментарий об использовании [x retainCount] для «помощи» в выявлении проблем с памятью. Как я узнал и опробовал несколько раз, это НЕ может отражать правильную ситуацию. Так что не полагайтесь на это значение - не используйте это - это, скорее всего, вызовет путаницу.

Во-вторых, это происходит со мной все время, когда я использую код Apple (который, конечно, работает в примере), а затем «неожиданно» вызывает проблемы в моем коде (отображается в инструменте LEAKS) - без «злоупотребил» конечно. Иногда я часами провожу часами и нахожу странные причины странного поведения. Например, просто добавив UINavigationControllerDelegate в качестве протокола для ответа, код может внезапно утечь - без изменения какой-либо другой строки кода!

0 голосов
/ 08 октября 2009

В этом втором бите кода вы [inSession release] дважды и ТОГДА dealloc it.

Извините, но это всего лишь около 200 различных типов ошибок.

Никогда не звоните dealloc Система сделает это за вас.

Не вызывайте release для одного и того же объекта дважды в одном и том же методе. Вы никогда не знаете, существует ли объект после первого вызова. Я удивлен тем, что вы не получаете исключений из-за переиздания, а тем более утечки.

Краткое объяснение использования удержания и выпуска см. В этом вопросе .

Для более подробного объяснения (и очень стоящего) прочтите документ Какао по этому вопросу.

0 голосов
/ 08 октября 2009

Попытка освободить его во второй раз после установки указателя переменной на nil не поможет - ничего не даст. Также не звоните в Deloc. Хотя технически не противозаконно ваше

- (GKSession *) peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type

метод указывает на утонченность стиля, которая может привести к такого рода утечке. Он создает новый сеанс GKSession, устанавливает его в переменную экземпляра и возвращает ссылку на него. Он не использует ни один из аргументов. Либо создайте переменную экземпляра ИЛИ автоматически высвободите ее и верните. Где код, вызывающий этот метод? Сохраняет ли вызывающая сторона возвращенное значение?

...