NSTableView с источником, приводит к EXC_BAD_ACCESS

#objective-c #cocoa #plist #exc-bad-access #nstableview

#objective-c #какао #список #исключение -плохой доступ #nstableview

Вопрос:

Хотя я знаком с кучей языков программирования, я уже некоторое время не могу привыкнуть к Cocoa / Objective-C.

Я хотел заполнить NSTableView некоторым содержимым, используя следующий код:

 - (int) numberOfRowsInTableView:(NSTableView *)aTableView {
return (int)[settingsPlist count];}

- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex {
    NSString *title = [[NSString stringWithString:[[aTableColumn headerCell] stringValue]] autorelease];
    NSLog(title); // debug
    NSLog(@"%i",rowIndex); // debug
    if([title isEqual: @"Plugin Name"]) {
        return [[settingsPlist objectForKey:[NSString stringWithFormat:@"%i",rowIndex]] objectForKey:@"name"];
    } else {
        return @"(n/a)";
    }
}
  

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

 <plist version="1.0">
<dict>
    <key>0</key>
    <dict>
        <key>name</key>
        <string>Test-Plugin</string>
        <key>version</key>
        <string>0.1</string>
        <key>type</key>
        <string>Car</string>
        <key>creator</key>
        <string>Icke</string>
        <key>checksum</key>
        <string>0x32</string>
        <key>link</key>
        <string>http://</string>
    </dict>
</dict>
  

Проблема: он отлично работает для одной строки (вы можете определить, посмотрев на вывод консоли, вызванный NSLog(title); и NSLog(rowIndex); ), однако после этого отладчик останавливает выполнение, вызывая EXC_BAD_ACCESS . Я знаю, что это значит, но я не знаю, почему я это получаю и как это исправить.

Спасибо за любую помощь. 🙂

Комментарии:

1. Знаете ли вы, что такое ARC, и почему вы его не используете? Objective-C, возможно, уже решил эту проблему для вас.

Ответ №1:

вы закончили выпуск здесь,

     NSString *title = [[NSString stringWithString:[[aTableColumn headerCell] stringValue]] autorelease];
  

-[NSString stringWithString:] возвращаемое значение уже автоматически возвращено, поэтому вам не нужно было вызывать его снова.