Я сделал приложение для Mac OS X, которое в основном работает под управлением NSTask. Дело в том, что я создал класс с именем XXTask для обработки файла и класс с именем XXController для обработки перетаскивания в графическом интерфейсе и просил XXTask обрабатывать файл время от времени.
Я делал почти то же самое в прошлом, и он работал нормально. На этот раз я добавил протокол делегата и сделал XXController делегатом XXTask.
Когда не удается выполнить XXTask, я прошу делегата показать конкретное представление и, таким образом, вызвать метод, подобный этому:
[delegate showView];
Это работает, но при попытке перезапуска с использованием информации, которую я сохранил при первом запуске, приложение выдает ошибки. Я использовал NSLog, чтобы увидеть, что именно было не так, и похоже, что три переменные экземпляра (две строки NSS и одна строка NSMutableArray) равны (null).
Это три переменные экземпляра:
NSString *curFilePath;
NSArray *lastArgs;
NSString *lastLaunchPath;
Я создаю их так:
curFilePath = filename;
// filename is an NSString passed to the method where I first create curFilePath
// the object passed to the method is a retained NSString (an instance variable of XXController)
lastArgs = [[NSMutableArray arrayWithObjects:curFilePath, [curFilePath stringByDeletingLastPathComponent], nil] retain];
lastLaunchPath = [[[NSBundle mainBundle] pathForResource:@"xxtask" ofType:@""] retain];
Все три переменные имеют значение null, но объект XXTask - нет, так как он все еще может выполнять код.
Ошибки:
2011-01-15 16:38:57.233 App[24179:a0f] PATH : (null)
2011-01-15 16:40:52.846 App[24212:a0f] LAST ARGS : (null)
2011-01-15 16:40:52.847 App[24212:a0f] LAST LP : (null)
2011-01-15 16:40:52.847 App[24212:a0f] Exception detected while handling key input.
2011-01-15 16:40:52.848 App[24212:a0f] *** -[NSCFArray insertObject:atIndex:]: index (1) beyond bounds (1)
Когда я не рисую представление, вызывая делегата, все в порядке. Я мог бы поместить этот метод представления в класс XXTask, но я бы предпочел сначала найти точное объяснение этому. Что происходит, когда я звоню делегату? (Я впервые попробовал использовать протоколы делегатов)
Спасибо, что ответили!
Если этот код кажется вам ужасным, у меня есть два оправдания:
- Я долго возился
время, прочитайте управление памятью
Документы и сделал самые глупые вещи.
- Управление памятью с подсчетом ссылок довольно ново для меня. Я
никогда не делал по-настоящему больших приложений, как это
один в прошлом, поэтому я обычно не могу
сделать много неправильно, но на этот раз память
гораздо важнее.