Нужно разъяснение по управлению памятью в NSArray - PullRequest
0 голосов
/ 12 января 2011

Скажи, что у меня есть:

NSDictionary *stuff; // {"1" => "hi", "2" => "bye"}
NSArray *array = [stuff allKeys];

allKeys делает копию ключей вещи, поэтому теперь массив отвечает за выдачу этой информации.

Позже, когда я захочу

Я не могу сделать:

array = [newStuff allKeys];

потому что он просто переназначит указатели и осиротит исходный массив. Я должен сначала удалить объекты

[array removeAllObjects];

Хотел узнать, правильно ли я понимаю? Спасибо!

Ответы [ 2 ]

5 голосов
/ 12 января 2011

Не совсем.

NSArray *array = [stuff allKeys];

Это дает вам массив, который вам не принадлежит.Является ли это технически копией или нет, это не ваша проблема.Поскольку средство доступа не начинается со слова «alloc» или «new» или содержит слово «copy», вы не владеете возвращаемым значением, что означает, что вам не нужно его выпускать.(Но вам нужно сохранить его, если вы хотите сохранить его.)

Если вы позже сделаете это:

array = [newStuff allKeys];

это нормально.Как вы знаете, это растоптало исходную ссылку, но так как вы не владеете этой ссылкой в ​​любом случае, все в порядке, чтобы отпустить ее.Эта новая ссылка также, конечно, не ваша, если вы не сохраните ее.

0 голосов
/ 12 января 2011

Нет. allKeys возвращает автоматически выпущенный NSArray. Он будет выпущен позже, если вы явно не retain. Так что настройка array = [newStuff allKeys]; вполне подойдет. Возможно, вам следует прочитать это руководство по Objective-C .

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