#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. Скорее всего, вы отправляете сообщение объекту после его освобождения.
Ответ №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