Сохранение [NSTextField stringValue] ... переменная очищается, когда мое окно закрывается? - PullRequest
1 голос
/ 26 ноября 2011

Поэтому я беру имя пользователя из поля и сохраняю его в переменной NSString:

    loggedInUser = [usernameField stringValue];
    [loginWindow close];

Позже я пытаюсь получить доступ к этим loggedInUser данным:

    NSLog(@"Logged in User:%@", loggedInUser);

Это часто, но не всегда, дает ошибку:

    Program received signal: "EXC_BAD_ACCESS". // Summary displays "{...}" for the value

Строка loggedInUser NSString очищается? Что случилось? (Я никогда не изменяю это значение самостоятельно).

Я думал только о том, что каким-то образом я сохраняю продолжение значения NSTextField в строке NSString. Затем, когда я закрываю окно, это значение очищается.

Это то, что происходит? Как сохранить это значение Textfield безопасным способом для дальнейшего использования?

Ответы [ 2 ]

3 голосов
/ 26 ноября 2011

Аааа, я только что понял, что происходит.

Когда вы закрываете свое окно (и оно, вероятно, освобождается), строка, которую вы присвоили переменной NSString вашего объекта, также автоматически высвобождается.

Вам необходимо явно сохранить его.

Или, более конкретно, сделать это:

loggedInUser = [[NSString alloc] initWithString: [usernameField stringValue]];

или:

loggedInUser = [[usernameField stringValue] copy];

не забудьтеосвободить loggedInUser, когда вызывается ваш метод dealloc (при условии, что вы здесь не используете ARC).

1 голос
/ 26 ноября 2011

Другое решение - хранить строку в свойстве, а не в переменной экземпляра.Вы можете объявить свойство как strong (или retain) или copy, и тогда вам будет принадлежать строка (или ее копия).

Вы упомянули, что переменная «очищена»когда строка умирает, но на самом деле это не так.Переменная не очищена , что является причиной сбоя: она по-прежнему содержит указатель на мертвый объект.Поддержание его с помощью strong или copy - это одно из решений, но другой вариант, если вы перейдете на ARC, - объявить свойство как weak.Затем в Mac OS X 10.7 и более поздних версиях свойство будет очищено (установлено nil), как только строка умрет.

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