#iphone #objective-c #cocoa-touch #uitableview
#iPhone #objective-c #cocoa-touch #uitableview
Вопрос:
В моем классе есть NSMutableString с именем alphabets. Я помещаю [алфавитный символиндекс: i] или [длина алфавитов] в TableView: cellForRowAtIndexPath:. Но когда я использую reloaddata, приложение вылетает.
Редактировать: должен ли я выполнять все вычисления с алфавитами за пределами TableView, а затем передавать массив значений в TableView.
здесь появляется «алфавиты»
в @interface
NSMutableString *alphabets;
@реализация
- (IBAction) textFieldDoneEditing: (id)sender {
Logic *myLogic = [[Logic alloc] init];
alphabets = [NSMutableString stringWithCapacity:0];
alphabets = [myLogic formatSentence: sentenceTextField.text];
alphabets = [myLogic makeAscending: alphabets];
[logicTable reloadData];
// removes keyboard
[sentenceTextField resignFirstResponder];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[MyTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// this causes all the problem
cell.textLabel.text = alphabets;
return cell;
}
Комментарии:
1. Определите «сбой приложения». Пожалуйста, опубликуйте содержимое консоли с объяснением сбоя.
2. Вам нужно будет опубликовать несколько примеров кода.
Ответ №1:
Просто предположение, не видя никакого кода, но является ли «алфавитный» мусор уже собранным к моменту вызова cellForRowAtIndexPath …? Или у вас уже есть возможность сохранить его?
Покажите нам несколько фрагментов кода. Тот, который создает / создает экземпляры «алфавитов», и тот, где он используется…
Редактировать:
Основываясь на фрагментах кода, которые вы добавили в свой вопрос, мне кажется, что вам, вероятно, нужно:
[alphabets retain];
после вашего последнего назначения «alphabets» — я не могу сказать наверняка, не видя реализацию «[myLogic makeAscending: alphabets]» — если он вызывает метод, который возвращает временную строку, вам нужно сохранить ее, чтобы сохранить в переменной-члене (ivar).
Конечно, поскольку вам необходимо сохранить его для доступа к нему на протяжении всего срока службы вашего собственного объекта, вам также придется соответствующим образом освободить его в вашей реализации dealloc .
Комментарии:
1. Нет сборки мусора на iPhone
2. Действительно? Каков ваш источник информации о сборке мусора на iPhone …?
3. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
4. Хм. Интересно. Думаю, мне следовало сказать «уже выпущено / удалено» вместо «собранный мусор» — на мой взгляд, концептуально они довольно близки друг к другу. Спасибо, что поправили меня.
5. о да, спасибо, вы были абсолютно правы. Я искал повсюду. Я подумал, что мне нужно понять структуру iphone или что-то в этом роде. Но нет, я допустил ошибку новичков. Я думаю, это не так уж плохо, учитывая, что я новичок. еще раз спасибо.
Ответ №2:
Причина сбоя вашего приложения, вероятно, в том, что вы вызываете reloadData внутри cellForRowAtIndexPath. Повторная загрузка данных приведет к повторному запуску cellForRowAtIndexPath, и вы застрянете в бесконечном цикле, пока у вас не закончится память. Попробуйте установить точку останова в вашем cellForRowAtIndexPath и посмотрите, как это происходит
Ответ №3:
Я бы сделал что-то вроде
if (alphabets) {
cell.textLabel.text = alphabets;
}
потому что из вашего примера кода кажется, что вы можете назначать textLabel.text из неинициализированного указателя, пока кто-то не отредактирует TextField.