Objective-C и EXC_BAD_ACCESS

#objective-c #cocoa

#objective-c #cocoa

Вопрос:

Я все еще новичок в Objective-C и Cocoa, но я пытаюсь учиться. Я создаю простой менеджер задач, но я продолжаю получать сбой EXC_BAD_ACCESS, и я не уверен, почему. Сбой происходит в моем главном файле.m здесь «return NSApplicationMain(argc, (const char **)argv);» поэтому его действительно сложно отлаживать.

Вот мой фактический файл реализации для моего делегата приложения.

 #import "ToDoAppDelegate.h"
#import "Task.h"

@implementation ToDoAppDelegate

@synthesize textTaskName;
@synthesize taskDate;
@synthesize window;
@synthesize newTaskWindow;
@synthesize tableView;
@synthesize arrayController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    taskArray = [[NSMutableArray alloc] init];

    [taskArray retain];
}

- (IBAction)addTaskClick:(id)sender 
{
    [NSApp beginSheet:newTaskWindow modalForWindow:window modalDelegate:self didEndSelector:NULL contextInfo:NULL];

    [taskDate setDateValue:[NSDate date]];
}

- (IBAction)btnSaveClick:(id)sender 
{
    Task *newTask = [[Task alloc] init];

    [newTask setTaskName:[textTaskName stringValue]];
    [newTask setTaskDueDate:[taskDate dateValue]];

    [arrayController addObject:newTask];
    [newTask release];

    [textTaskName setStringValue:@""];

    [NSApp endSheet:newTaskWindow];
    [newTaskWindow orderOut:self];
}

- (IBAction)btnCancelClick:(id)sender 
{
    [NSApp endSheet:newTaskWindow];
    [newTaskWindow orderOut:self];
}

@end
  

Что происходит, когда вызывается метод btnSaveClick, я получаю сбой EXC_BAD_ACCESS сразу после завершения выполнения метода.

Вот предыстория сбоя:

 (gdb) bt
#0  0x00007fff851d212d in objc_msgSend ()
#1  0x00007fff80f9d1e6 in _CFAutoreleasePoolPop ()
#2  0x00007fff809a0fe0 in -[NSAutoreleasePool drain] ()
#3  0x00007fff8780451f in -[NSApplication run] ()
#4  0x00007fff877fd1a8 in NSApplicationMain ()
#5  0x0000000100001a82 in main (argc=1, argv=0x7fff5fbff638) at /Users/mattwise1985/Documents/Development/xCode Projects/ToDo/ToDo/main.m:13
  

Поскольку это всего лишь тестовый проект, я не возражаю, если кто-то захочет загрузить его, чтобы проверить, что у меня не так. Его можно загрузить отсюда:http://www.narfsoft.com/downloads/ToDo.zip

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

1. Покажите нам обратную трассировку из GDB, когда произойдет сбой.

2. Добавлен обратный путь к основному сообщению.

Ответ №1:

Попробуйте включить NSZombie. Скорее всего, вы отправляете сообщение объекту после его освобождения.

http://www.cocoadev.com/index.pl?NSZombieEnabled

Ответ №2:

Вы уверены, что установили выход для arrayController , и что это не так nil ?

Кстати:

 taskArray = [[NSMutableArray alloc] init];

[taskArray retain];
  

Вам нужно будет дважды освободить свой массив, поскольку вы сохраняете его после явного выделения…

Как сказал Джонатан, обратная ссылка из GDB была бы оценена…

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

1. У меня действительно установлен выход, он установлен в файле интерфейса: @property (назначить) IBOutlet NSArrayController *ArrayController;

Ответ №3:

Эта проблема возникает из-за того, что вы установили привязки для столбцов табличного представления, но не установили привязки для самого табличного представления.

В MainMenu.xib выберите табличное представление и привяжите его содержимое (Содержимое таблицы > Content) к контроллеру массива key arrangedObjects . Пока вы этим занимаетесь, привяжите его индексы выбора (содержимое таблицы> Индексы выбора) к контроллеру массива key selectionIndexes .

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

1. Ну, я думал, что это сделало это. После дополнительного тестирования это работает, когда я добавляю первый элемент. Когда я пытаюсь добавить другой элемент, он снова выходит из строя с EXC_BAD_ACCESS