Цель-C: Вопрос о NSString и области - PullRequest
1 голос
/ 20 сентября 2011

У меня есть глобальная переменная NSString, которую я объявил в моем файле ViewController.m, вне каких-либо методов, но не в моем .h файле.

NSString *menuString;

Он инициализируется внутри webViewDidFinishLoad и работает, когда я делаю это

NSString *menu = [self getParameter:url :@"Menu"];
menuString = [menu copy];

но не тогда, когда я делаю это

NSString *menu = [self getParameter:url :@"Menu"];
menuString = menu;

или

menuString = [self getParameter:url :@"Menu"];

Здесь под словом «это работает» я имею в виду, что значение сохранено, и я могу использовать его в других методах. В противном случае во время отладки он говорит, что menuString находится вне области видимости. Мне было интересно, почему он ведет себя по-разному в зависимости от инициализации.

(getParameter - это просто метод, который принимает две строки и возвращает строку).

Спасибо!

Ответы [ 2 ]

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

[self getParameter:url :@"Menu"]; возвращает autoreleased строковый объект.Это означает, что во время следующего цикла пула автоматического выпуска он будет освобожден.Если ничто иное не увеличило его счет удержания (вызов retain или copy), оно будет удалено.Как только он будет удален, и вы попытаетесь его использовать, вы потерпите крах.

В первом примере вы скопируете строку, в которой теперь есть объект, который не будет очищен при очистке пула автоматического выпуска.

Однако, убедитесь, что вы release объект в методе dealloc вашего класса, чтобы предотвратить утечку.

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

Метод getParameter: возвращает объект автоматического освобождения NSString.

Это означает, что этот объект будет автоматически освобожден в конце цикла выполнения (когда пул автоматического освобождения).

Поскольку вы никогда не сохраняли этот объект, как только он автоматически освобожден, он отменен, и вы больше не можете его использовать.

Делая copy, вы создаете сохраненную копию этого объекта, которая не будетбыть автоматически освобожден в конце цикла выполнения.
Это также будет работать, если вы использовали retain:

menuString = [[self getParameter:url :@"Menu"] retain];

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

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