Небольшая проблема с памятью в Objective-C - PullRequest
0 голосов
/ 15 января 2011

Я сделал приложение для 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, но я бы предпочел сначала найти точное объяснение этому. Что происходит, когда я звоню делегату? (Я впервые попробовал использовать протоколы делегатов)

Спасибо, что ответили!

Если этот код кажется вам ужасным, у меня есть два оправдания:

  1. Я долго возился время, прочитайте управление памятью Документы и сделал самые глупые вещи.
  2. Управление памятью с подсчетом ссылок довольно ново для меня. Я никогда не делал по-настоящему больших приложений, как это один в прошлом, поэтому я обычно не могу сделать много неправильно, но на этот раз память гораздо важнее.

1 Ответ

0 голосов
/ 15 января 2011

Если я правильно понимаю (это довольно сложно без кода), вы храните некоторую информацию, хранящуюся в XXTask, верно?

Сохраняете ли вы / копируете данные?Если нет, он будет выпущен, как только будет выпущен XXTask.Если я неправильно понимаю ваш вопрос, я прошу вас предоставить код, который демонстрирует вашу проблему.Это значительно упрощает поиск ошибок.

...