Выпущенный объект падает. Приложение - проблема с управлением памятью alloc / init - PullRequest
2 голосов
/ 14 сентября 2010

У меня есть класс flipView, который я выделяю и инициирую.Но когда я выпускаю его, приложение вылетает.Если я не выпущу его, приложение работает нормально, так что кажется.Сообщение об ошибке, которое я получаю, когда выпускаю его:

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 ]

2 голосов
/ 01 июля 2011

Вы правильно поставили последнюю строку там, так как когда вы передаете "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 голосов
/ 14 сентября 2010

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

...