1

Я немного смущен при использовании NSDictionary. У меня есть массив (nameArray), я добавляю этот массив в словарь (nameDict), и, наконец, я добавляю этот словарь в другой словарь (requestDict).Управление памятью в NSMutableArray

NSMutableArray *nameArray = [[NSMutableArray alloc] initWithObjects:@"abcd",@"lmnop",@"xyz",@"pqr", nil]; 
NSMutableDictionary *nameDict = [NSMutableDictionary alloc] initWithObjectsAndKeys:nameArray,@"name", nil]; 
NSDictionary *requestDict = [NSDictionary dictionaryWithDictionary:nameDict]; 

Когда я удаляю объекты из имениDict, requestDict не влияет.

[nameDict removeAllObjects] 

Пока все хорошо. Но мой запрос заключается в том, что я удаляю объекты из nameArray, почему влияет responseDict.

[nameArray removeAllObjects];

Почему NameArray до сих пор объекты. Если он не был удален, как только я удалю объекты из имениDict. Пожалуйста, помогите мне понять, если я что-то упустил.

Что произойдет, если я установил nameArray на nil в этом случае?

ответ

1

Оба nameDict и requestDict имеют ссылку на единственный массив, на который указывает nameArray. Изменения, внесенные в nameArray, видны обоими словарями.

Когда вы сделали [nameArray removeAllObjects], вы видите изменение в массиве в обоих словарях, потому что оба словаря ссылаются на одну копию изменяемого массива.

Если вы установили nameArray в nil, ничего не происходит. Оба словаря все еще имеют ссылку на изменяемый массив.

+0

Но я никогда не делал ссылку между nameArray на requestDict. Вместо этого я добавил nameArray в nameDict. Должна ли requestDict не ссылаться на nameDict, а nameDict имеет ссылку на nameArray? – angraonhunt

+0

Уверен, что да. 'nameDict' содержит' nameArray'. Затем вы создаете копию 'nameDict' как' requestDict'. Это означает, что 'requestDict' имеет ссылку на те же объекты (мелкой копии) как' nameDict'. – rmaddy

+0

Теперь я вижу, что происходит ... Спасибо ... :) – angraonhunt

Смежные вопросы