NSMutableArrays - я могу это сделать? - PullRequest
0 голосов
/ 28 ноября 2011

В моем приложении синглтон-класс (SharedData) выделяет память для NSMutableArray:

[self sharedMutableArray] = [[NSMutableArray alloc] init];

Класс A заполняет этот sharedMutableArray:

NSObject *obj = [NSObject alloc] init];
[sharedMutableArray  addObject];
obj = nil;

Класс B делает это - иэто мой вопрос:

NSMutableArray *tmpArray = sharedMutableArray;
       ... uses the tmpArray locally
[tmpArray removeAllObjects];
tmpArray = nil;

Это унаследованный код, и я догадываюсь, что это НЕТ-НЕТ.Может кто-нибудь подтвердить, что присвоение nil для tmpArray освободит память для sharedMutableArray .... Я думаю, автор хотел выпустить только tmpArray ...

Ответы [ 2 ]

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

Назначение nil для tmpArray только устанавливает указатель на объект на nil. Это никак не влияет на сам объект (или его жизненный цикл). В этом случае установка созданных вами объектов на nil ничего не делает, поскольку объявление их переменных находится в локальной области видимости - если вы хотите, чтобы объекты были освобождены из памяти, вам нужно отправить их release перед установкой указатель на объект nil.

Однако отправка removeAllObjects влияет на ваш исходный sharedArray, поскольку вы не копировали массив, вы просто устанавливаете новый указатель, указывающий на «синглтон». Вы, вероятно, хотите это:

NSMutableArray *tmpArray = [NSMutableArray arrayWithArray:sharedMutableArray];

Вам не нужно будет использовать removeAllObjects в приведенном выше случае, потому что это будет autorelease'd. Я предлагаю вам прочитать это .

0 голосов
/ 28 ноября 2011

tmpArray - указатель, и он инициализируется так, чтобы указывать на тот же изменяемый массив, на который указывает sharedMutableArray.По этой причине строка:

[tmpArray removeAllObjects];

освободит массив, и любой, кто использует sharedMutableArray, увидит это изменение.Другими словами, присваивание

NSMutableArray *tmpArray = sharedMutableArray;

не делает копию самого массива, оно только копирует указатель.Любые сообщения, которые вы отправляете с помощью этого указателя, будут отправлены в общий массив.Аналогично, присвоение nil tmpArray устанавливает указатель tmpArray, но ничего не делает с самим массивом.

Наконец, установка переменной в nil никогдаосвобождает памятьУстановка свойства на nil, с другой стороны, освободит память при некоторых условиях (например, когда объявлено, что свойство сохраняет свое содержимое).Вы устанавливаете здесь переменную, а не свойство, поэтому нет никаких шансов, что массив будет освобожден.

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