NSMutableArray Элемент потерян при отображении в NSTableView вызывается - PullRequest
0 голосов
/ 20 ноября 2010

Я пытался отобразить содержимое массива в табличном представлении. Представление таблицы имеет один столбец. Мой класс RKCandidate , который является подклассом NSWindowController . RKCandidate также является владельцем файла 'nib'. В IB я выбрал владельца файла в качестве источника данных для таблицы.

Существуют методы, которые я использую для обновления таблицы,

- (id) initWithClient:(TextInputController *) client
{
 self = [super initWithWindowNibName:@"RKCandidate"];
 if (self != nil) {
  _client = client;

 }
 return self;
}

- (void) dealloc
{
 [optionsArray release];
 [super dealloc];
}
- (void) updateCandidate {

 NSLog(@"updateCandidate Called.\n");

 optionsArray = [_client composedStringArray:self];
 [candidateOptions reloadData];

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSString *benChar = [optionsArray objectAtIndex:0];
 //NSLog(@"Object Retain Count: %@i\n",[benChar retainCount]);
  }
#pragma mark TableView Data Source Methods
#pragma mark -

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSLog(@"Object Retain Count: %@i\n",[[optionsArray objectAtIndex:0] retainCount]);

 return [optionsArray count];
}

- (id)tableView:(NSTableView *)aTableView 
     objectValueForTableColumn:(NSTableColumn *)aTableColumn 
    row:(NSInteger)rowIndex {

 NSLog(@"Retain Count of OptionsArray: %i\n",[optionsArray retainCount]);
 NSLog(@"Object Count of OptionsArray: %i\n",[optionsArray count]);
 NSLog(@"Address of Object: %i\n",[optionsArray objectAtIndex:0]);
 NSLog(@"Object: %@\n",[optionsArray objectAtIndex:0]);
 //NSLog(@"Object Retain Count: %@i\n",[[optionsArray objectAtIndex:0] retainCount]);

 return [optionsArray objectAtIndex:rowIndex];
}

optionsArray обновляется простым клиентским методом, метод выглядит следующим образом:

-(NSMutableArray *) composedStringArray:(id)sender {

 NSLog(@"returning composedStringArray.\n");

 return convertBufferArray;
}

convertBufferArray является изменяемым массивом.

Когда метод updateCandidate вызывается впервые. Это работает хорошо. Но проблема начинается, когда я вызываю его во второй раз после обновления массива convertBufferArray внутри клиента.

Когда метод updateCandidate вызывается с первого раза, когда журнал консоли выглядит следующим образом:

2010-11-20 09:03:35.385 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.385 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.386 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.386 Input Method Tester[7225:a0f] Object: ∆
2010-11-20 09:03:35.392 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.392 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.393 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.393 Input Method Tester[7225:a0f] Object: ∆
2010-11-20 09:03:35.397 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:35.397 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:35.398 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:35.399 Input Method Tester[7225:a0f] Object: ∆

В табличном представлении отображается содержимое массива.

Но когда я просто добавляю еще одну букву в строку Object , каким-то образом строка заменяется пустой строкой, когда - (id) tableView: (NSTableView *) aTableView objectValueForTableColumn: (NSTableColumn * ) aTableColumn row: (NSInteger) вызывается rowIndex. Журнал выглядит следующим образом.

2010-11-20 09:03:38.349 Input Method Tester[7225:a0f] returning composedStringArray.
2010-11-20 09:03:38.350 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.351 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.352 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.353 Input Method Tester[7225:a0f] Object: ƍ
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.354 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.355 Input Method Tester[7225:a0f] Object: ƍ
2010-11-20 09:03:38.358 Input Method Tester[7225:a0f] Retain Count of OptionsArray: 1
2010-11-20 09:03:38.358 Input Method Tester[7225:a0f] Object Count of OptionsArray: 1
2010-11-20 09:03:38.359 Input Method Tester[7225:a0f] Address of Object: 1372384
2010-11-20 09:03:38.359 Input Method Tester[7225:a0f] Object: 

Как видно из строки списка в журнале выше, строка пуста. TableView становится пустым.

Что-то не так я делаю? Я пытался поставить релиз и сохранить optionsArray , но результат тот же. Я также пытался скопировать содержимое compedBufferArray в optionsArray . Я пытался поставить

optionsArray = [_client composedStringArray:self];

в метод init. Результат одинаков для всех случаев.

Пожалуйста, помогите. Я не мог решить эту проблему за последние два дня. Пожалуйста, помогите.

Извините, я не смог опубликовать изображение или ссылку, так как я совершенно новый в Stack Overflow.

С уважением,

Raiyan

1 Ответ

1 голос
/ 20 ноября 2010

Первый:

Не звоните retainCount

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

Ваша ошибка выглядит как проблема управления памятью. То, что это не сбой - просто удача.

Вы должны прочитать Руководство по управлению памятью какао пару раз (пока оно не погрузилось - когда я начал работать с Objective-C, я обнаружил, что чтение языковых документов несколько раз было чрезвычайно полезным) .

Ваш -init метод выглядит подозрительным; _client = client; не сохранит _client.

Вы также должны использовать «строить и анализировать» в своем коде. Статический анализатор llvm определит большинство проблем управления памятью в вашем коде.

Наконец, научитесь пользоваться инструментом обнаружения зомби. См. Некоторые ответы здесь для получения дополнительной информации.

...