NSURL освобождается почти сразу после создания (Цель C) - PullRequest
1 голос
/ 21 сентября 2011

В моем коде я создаю объект NSURL с именем fromURL в заголовочном файле моего делегата приложения.

NSURL *fromURL;

Вот когда я его установил:

NSOpenPanel* openDlg = [NSOpenPanel openPanel];
[openDlg setCanChooseFiles:NO];
[openDlg setCanChooseDirectories:YES];
[openDlg setCanCreateDirectories:YES];
[openDlg setPrompt:@"Select"];
if ([openDlg runModal] == NSOKButton )
{
    fromURL = [openDlg URL];
}

Вот моя проблема. Когда я его устанавливаю, я могу NSLog установить то, что установлено сразу после его создания, но в следующий раз, когда я пытаюсь получить от него информацию, он говорит EXC_BAD_ACCESS. Я включил зомби, и он становится зомби почти сразу после того, как я его установил.

Как это сразу же освобождается?!?

1 Ответ

0 голосов
/ 21 сентября 2011

Похоже, вам нужно прочитать Руководство по программированию управления памятью .

Здесь происходит то, что ваша переменная fromURL является иваром (по крайней мере, я предполагаю, что это ивар, вы могли бы вместо этого сделать его глобальной переменной).Вы назначаете это в своем методе.Но вы не имеете дело с управлением памятью, поэтому, когда управление возвращается в цикл выполнения и пул автоматического выпуска очищается, ваш fromURL ivar в конечном итоге указывает на освобожденный объект.Вы должны сохранить и отпустить по мере необходимости.Для этого конкретного метода я мог бы использовать

if ([openDlg runModal == NSOKButton)
{
    [fromURL release];
    fromURL = [[openDlg URL] retain];
}

И не забудьте также высвободить fromURL в вашем методе -dealloc.

Это можно немного упростить, если вы определитесобственность для вашего fromURL, как в

@property (nonatomic, retain) NSURL *fromURL;

Таким образом, вы можете использовать

self.fromURL = [openDlg URL];

и не беспокоиться о сохранении / освобождении, за исключением -dealloc, где вам все еще нужно[fromURL release]

...