2012-05-07 7 views
0

Я использую попытку получить высоту для нескольких UITableCellView, которые определены в их собственном XIB. Я создаю список высот, которые используются в высоте обратного вызова forRowInPathIndex UITableViewDelegate. Когда я это делаю, приложение врезается как-будто повреждение памяти.ios: Почему временная нагрузка XIB, чтобы получить высоту кадра, повреждая память?

arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil]; 

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0]; 

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz]; 

[arrayOfTableCellView release]; 

Я посмотрел на saveCount, и это так, как ожидалось.

+1

Как примечание: вы не должны доверять keepCount. Вы не знаете, что происходит за кулисами. Какая ошибка вы получаете? Я предполагаю, что это EXC_BAD_ACCESS? –

+0

BTW - ошибка выскочила из приложения. Во время моего Instrumentation, мой опыт заключается в том, что большинство из них оказываются непоследовательностью сохранения/выпуска памяти. В некоторых случаях зомби. – mobibob

ответ

1

Ну ответ прост, из документации:

Возвращаемое значение

Массив, содержащий объекты верхнего уровня в файле бобах. Массив не содержит ссылок на владельца файла или любые объекты-прокси; содержит только те объекты, которые были созданы при создании файла nib . Вы должны сохранить либо возвращенный массив, либо объекты, которые он содержит вручную, чтобы предотвратить удаление файлов файлов с досрочно.

Похоже, вы просто присваиваете возвращаемое значение arrayOfTableCellView. Если вы хотите сохранить возвращаемое значение, а arrayOfTableCellView на самом деле является свойством на вашем контроллере viewController, вам следует назначить его с помощью self.arrayOfTableCellView.

Если вы не сохранили его, вам не нужно выпускать его, потому что вы его не обладаете. Так что, когда вы на самом деле получить массив как этот

NSArray *arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil]; 

тогда вы не хотите иметь

[arrayOfTableCellView release]; 

в там, потому что вы не выделить объект.

EDIT:

Просто calarify тебе это, я просто побежал ваш код, с ожидаемым результатом:

NSArray * arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"JLUViewController" owner:self options:nil]; 

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0]; 

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz]; 

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

Если добавить

[arrayOfTableCellView release]; 

хотя это будет крах, сообщая EXC_BAD_ACCESS, потому что вы пытались освободить объект, который вы не владеете. Обратите внимание, как я сделал NSArray локальной переменной? Вы должны сделать то же самое, потому что вам не нужно, чтобы он был свойством, поскольку вы просто используете его внутри области действия. Также не следует, чтобы, если arrayCellHeights является свойством внутри вашего контроллера просмотра, всегда используйте self.arrayCellHeights для доступа к нему.

+0

ОК - позвольте мне сделать еще несколько тестов.Но когда я изначально не «удержался», Инструменты объявили утечку. Если я «NSLog» сохранил счетчик массива, он установлен в 1, который я предполагаю из loadNibNamed. Сказав это, ваш комментарий выше в вопросе гласит, что я не могу доверять ценности, поскольку это волшебное значение, за кулисами. – mobibob

+0

@mobibob: это вас достало? –

+0

Мой сбой был побочным эффектом проблемы iOS4 с объемом памяти приложения. По-видимому, iOS5 выделяет больше памяти для первоначального запуска (x4 или x10) по сравнению с iOS4. Как только я уменьшил свой первоначальный размер приложения, проблема исчезла - на некоторое время. Позже он разбился по той же причине, но работает на iOS5 навсегда. Попытайтесь убедить руководство в этом :) – mobibob