Как правильно получить объект NSString из NSArray, помня об управлении памятью? - PullRequest
1 голос
/ 17 мая 2011

Как правильно получить объект NSString из NSArray, помня об управлении памятью.

Предположим, у меня есть массив

NSArray *myNewArray = [[NSArray alloc] initWithObjects:.......];

Теперь я хочу получить объект из этого NSArray по индексу 2.

NSString *nameString = [myNewArray objectAtIndex:2]; // is it the right way? how to deal with "nameString" 
                                                     // now regarding memory managment, should I release it ?

ИЛИ Я должен сначала выделить nameString, а затем присвоить ему значение?

Ответы [ 6 ]

4 голосов
/ 17 мая 2011

Ознакомьтесь с правилами управления памятью какао (сколько раз я начинал пост с этим предложением?). В частности

  • Вы выпускаете или выпускаете только свои собственные объекты.
    • Вы вступаете во владение объектом, если создаете его с помощью метода, имя которого начинается с «alloc», «new», «copy» или «mutableCopy» (например, alloc, newObject или mutableCopy), или если Вы отправляете ему сообщение о сохранении.
    • Вы используете release или autorelease, чтобы отказаться от владения объектом. «autorelease» означает просто «отправить сообщение о выпуске в будущем» (а именно: когда используемый пул автоматического выпуска получает сообщение «утечка» - чтобы понять, когда это произойдет, см. «Пулы автоматического освобождения»).

Метод objectAtIndex: начинается с "alloc"? Нет. Это начинается с "нового"? Нет. Это начинается с "copy" или "mutableCopy"? Нет. Вы отправили retain возвращенному объекту? Нет.

Поэтому у вас нет nameString. Поэтому вы не должны выпускать или автоматически выпускать его.

Извините, если вышеупомянутое кажется немного "ведущим за нос", но когда я впервые начал с Objective-C, я счел полезным в значительной степени пройти через все вышеизложенное в моей голове именно таким образом, в противном случае я имел тенденцию к понять неправильно. Все это не займет много времени, чтобы стать второй натурой.

1 голос
/ 17 мая 2011

Я думаю, вы еще не полностью поняли концепцию "указателя". Ваша переменная nameString является просто указателем. Не строка

В строке:

NSString *nameString = [myNewArray objectAtIndex:2];

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

Если вы собираетесь сохранить этот объект живым (даже если массив будет освобожден), вам лучше сохранить этот объект.

0 голосов
/ 17 мая 2011
NSArray *myNewArray = [[NSArray alloc] initWithObjects:.......];
NSString *nameString = [myNewArray objectAtIndex:2]
[myArray release];

Вот и все, больше не нужно беспокоиться об этом. NSString будет выпущен самой средой.

0 голосов
/ 17 мая 2011

Нет необходимости освобождать nameString. Вы освобождаете только когда используете (alloc »,« new »,« copy »или« mutableCopy »).

0 голосов
/ 17 мая 2011

Нет необходимости выделять или инициализировать объект NSString, и в конце концов, если вы не выделяете какую-либо память, освобождать не нужно .... Только освобождать объекты NSArray больше ничего ....

Вы идете правильным путем ...

0 голосов
/ 17 мая 2011

NSArray *myNewArray = [[NSArray alloc] initWithObjects:.......]; и получение значения в NSString из любого из index не повлияет на память ... нет необходимости выделять здесь.Собранный NSString не требуется хранить до тех пор, пока вы не передадите его право собственности другому контроллеру / объекту.

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