2010-09-14 4 views
2

У меня есть класс flipView, который я выделяю и запускаю. Но, когда я его выпускаю, приложение падает. Если я его не выпущу, приложение работает нормально, так что кажется. Сообщение об ошибке, которое я получаю, когда я его освобождаю:Выпущенные объекты сбой App - проблема с управлением памятью alloc/init

Malloc - ошибка для объекта: освобожден указатель объекта, не был выделен.

Если бы вы могли мне помочь, я был бы вам признателен.

- (IBAction)showInfo { 
    FlippedProduceView *flippedView = [[FlippedProduceView alloc]initWithIndexPath:index]; 

    flippedView.flipDelegate = self; 

    flippedView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

    [self presentModalViewController:flippedView animated:YES]; 

    //[flippedView release]; //******** Maybe A Memory Leak *********\\ 
} 

ответ

2

Вы правильно разместите последнюю строку там, так как, когда вы передаете «flippedView» в качестве аргумента для «presentModalViewController», он сохраняет внутри себя «flippedView» (без необходимости писать дополнительный код).

Большинство функций в инфраструктурах Apple сохранят объект, если он кажется логичным. Если вы представляете контроллер представления, на самом деле нет ситуаций, когда вы хотите передать в освобожденный (или подлежащий освобождению) контроллер, который должен быть представлен. Контроллер содержимого, который вы представляете внутри, будет удерживать субконтроллер до его увольнения.

Так что просто так мы ясны, вот правильный код (при условии отсутствия других необычных обстоятельств):

- (IBAction)showInfo { 

// Here the retain count gets incremented to 1 (usually "alloc" or "copy" does that) 
FlippedProduceView *flippedView = [[FlippedProduceView alloc]initWithIndexPath:index]; 

// Retain count is unchanged 
flippedView.flipDelegate = self; 

// Retain count is unchanged 
flippedView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 

// Retain count is incremented again inside this method (to 2) 
[self presentModalViewController:flippedView animated:YES]; 

// Retain count is decremented by 1 (back to 1) 
[flippedView release] 
} 

// ... Other code 

// Finally, whenever the view controller gets dismissed, it will be released again 
// and the retain count will be 0, theoretically qualifying it for deallocation 
0

Ваше сообщение presentModalViewController: должен вызвать retain на flippedView. Это не позволит ему освободиться до цели presentModalViewController:. Затем вы можете позвонить по номеру [flippedView release], как и в конце этой процедуры. Разве что-то еще отсутствует?

+0

Спасибо fbrereto за ответ на мой вопрос. Я полный новичок и работаю над своим первым приложением. Я почти закончил, но эта проблема удерживает меня. Я не понимаю, как бы я закодировал выражение, которое вы упомянули. Было бы так: FlippedProduceView * fView = [[FlippedProduceView alloc] initWithIndexPath: index]; [fView сохранить]; fView.flipDelegate = self; fView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController: fView animated: YES]; NSLog (@ "Сохранять счетчик fView:% d", [fView retainCount]); [fView release]; –

+0

В порядке, не так ли? [self presentModalViewController: [fView сохранить] анимированный: ДА]; –

+0

Внутри 'presentModalViewController' вы бы назвали' keep' на получаемом вами представлении. Вам не нужно будет вызывать 'keep' в' showInfo', поскольку фаза alloc/init делает это автоматически для вас. Затем вы можете вызывать 'release' из' showInfo', и объект все равно будет существовать, потому что он был сохранен 'presentModalViewController'. – fbrereto

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