Почему я теряю доступ к этой переменной экземпляра? - PullRequest
0 голосов
/ 01 сентября 2011

zURL объявлен как:

.h:

@interface PanelController : NSWindowController <NSWindowDelegate>
{
    NSURL *zURL;
}

@property (nonatomic, copy) NSURL *zURL;

.m:

@synthesize zURL;

В одном IBAction у меня есть:

 - (IBAction)openBrowser:(id)sender {
    NSOpenPanel *zOpenPanel = [NSOpenPanel openPanel];
    [zOpenPanel setCanChooseFiles: TRUE];
    [zOpenPanel setCanChooseDirectories: TRUE];
    [zOpenPanel setAllowsMultipleSelection: TRUE];
    [zOpenPanel setLevel:CGShieldingWindowLevel()];
    NSInteger zIntResult = [zOpenPanel runModal];
    if (zIntResult == NSFileHandlingPanelCancelButton) {
        return;
    } 

    // zURL set here
    zURL = [NSURL alloc];
    zURL = [zOpenPanel URL];
    NSLog(@"url = %@", zURL); // works

    NSString *zStr = [zURL absoluteString];
    _fileField.stringValue = zStr;
    [_importButton setEnabled:TRUE];
    [self openPanel];
}

В следующем IBAction:

NSLog(@"url = %@", zURL); // EXC_BAD_ACCESS error

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Вы назначаете свой URL атрибуту URL zOpenPanel, но не указываете, что намерены сохранить ссылку, сохранив ее.

zURL = [NSURL alloc]; // assign my variable to a new URL, allocating memory

ваша вторая строка заменяет вашу ссылку ссылкой на атрибут URL zOpenPanel, пропуская URL, который вы только что создали.

в какой-то момент позже, zOpenPanel сообщает ОС, что оно завершено с ее URL, и освобождает оперативную память, тем самым лишая законной силы вашу ссылку.

что вы, вероятно, пытаетесь сделать:

zURL = [[zOpenPanel URL] retain];

назначает ссылку на атрибут URL zOpenPanel и сообщает ОС, что вы хотите частично владеть его временем жизни.

Когда вы закончите работу с zURL, вам нужно будет выпустить его и отозвать заявку на срок его службы:

[zURL release];

редактирование:

так как вы объявляете его как свойство в своем классе, вы должны использовать нотацию свойства для вызова соответствующего поведения:

self.zURL = [zOpenPanel URL];

, поскольку вы объявили, что свойство имеет семантику копирования, будет скопирован URL-адрес, и вам все равно нужно будет опубликовать его в вашем dealloc.

1 голос
/ 01 сентября 2011

В первой строке вы выделяете NSURL, но не вызываете инициализатор.Во второй строке вы назначаете zURL из другого места, теряя указатель на объект, который вы создали в первой строке (что является утечкой памяти).

Где хранится zURL?Это переменная экземпляра?Если это так, вы не сохранили то, что было возвращено из [URL-адреса zOpenPanel], поэтому вы не можете быть уверены, что объект не был освобожден к моменту вызова в IBAction.

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

Я подозреваю, что ваш zURL var был выпущен в какой-то момент, как Джордж указал, что было бы полезно, если бы вы сообщили, как объявляется zURL.

Кроме того, вам не нужно выполнять [NSURLalloc], если вы немедленно заменяете значение zURL на следующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...