Передача объекта в нераспределенный указатель - PullRequest
3 голосов
/ 03 марта 2011

Допустим, я объявил строку NSSt вот так

NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString;

tempString = myString;

[myString release];

Мой вопрос: почему это работает?Как видите, я не выделил для tempString.Поэтому я не думаю, что есть необходимость выпустить это.Но если я попытаюсь выделить и запустить tempString, это приведет к ошибке.

NSString *myString = [[NSString alloc] initWithString:@"Never Heard"];
NSString *tempString = [[NSString alloc] init];

tempString = myString;

[myString release];

В качестве примера я использую NSString, но вместо этого у меня реализованы разные классы.Я пытаюсь подчеркнуть, как распределение памяти работает здесь.Хотите уточнить и объяснить?

Ответы [ 3 ]

3 голосов
/ 03 марта 2011

Указатель - это просто адрес памяти.Вы создаете только один объект, а затем указываете tempString на этот объект.И tempString == myString.

[myString release] освобождает строку, оставляя оба указателя указывающими на освобожденную память.

Не путайте переменные с объектами.Переменные просто являются дескрипторами, которые вы используете для доступа к объектам.Создание новой переменной не означает, что вы создаете новый объект.

2 голосов
/ 03 марта 2011

Это абсолютно не касается выделения памяти.Это все о том, как работают указатели.Когда вы делаете это:

tempString = myString;

tempString указывает на тот же объект, что и myString.Поэтому вызов любого метода в tempString - это то же самое, что вызов их в myString.

1 голос
/ 03 марта 2011
tempString = myString;

В приведенном выше операторе оба myString, tempString указывают на место, где хранится "Never Hard".Итак, ошибки нет.

И я не понял, когда вы имели в виду - "But if I try to alloc and init the tempString, it will bring an error."

Редактировать 1

Второй фрагмент кода является примером утечки памяти.tempString выделяется ячейка памяти.Давайте поработаем с примером -

myString -> MemoryLocation_1 that has "Never Hard"
tempString -> MemoryLocation_2 and the location it is pointing to isn't intialized with any value.

Now, with this statement -
tempString = myString;

Both myString  and tempString -> MemoryLocation_1 that has "Never Hard"

А как насчет MemoryLocation_2, полученного из бесплатного магазина.Он не возвращается обратно в свободное хранилище и лежит там, к которому ни одна программа не может получить доступ до завершения программы.Таким образом, утечка памяти .Надеюсь, что это поможет понять.

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