Запутанное поведение памяти с 2D NSMutableArray - PullRequest
3 голосов
/ 01 февраля 2012

Это мой первый вопрос о переполнении стека, и я надеюсь, что это довольно просто. У меня есть следующий код, который я написал, чтобы выяснить, что именно я добавляю в 'externalArray' в этом случае:

NSMutableArray *contents = [[NSMutableArray alloc] initWithContentsOfFile:path];
outerArray = [[NSMutableArray alloc] initWithCapacity:2];
[outerArray addObject:contents];

[contents removeObjectAtIndex:0];
[contents release];
contents = nil;

NSMutableArray *test = [outerArray objectAtIndex:0];

NSLog(@"Test at 0: %@", [test objectAtIndex:0]);

Теперь запутанная часть заключается в следующем: то, что я вижу, это элемент, изначально находящийся в индексе 1 «содержимого», записываемый NSLog. Это не имеет смысла для меня:

  • Если бы я добавлял копию 'contents' в 'outerArray', я бы ожидал, что 'test' будет содержать эту копию, и он выведет исходный 0-й элемент 'содержимого'.
  • Если бы я добавил указатель на 'contents' в 'outerArray', то я ожидал бы, что строка NSLog выдаст ошибку.

Единственное, о чем я могу думать, - это то, что я добавляю указатель на «содержимое» к «внешнему массиву», но его освобождение не перезаписывает данные. В общем, мне повезло, что NSLog не отказывает, но может и позже.

Это правильно?

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

То, что вы видите, верно: NSMutableArray сохраняет добавленные к нему объекты, поэтому contents остается активным, даже если ваш код выпустил ссылку на него.Вторая ссылка (изнутри outerArray) - это то, что удерживает ваш внутренний массив, ранее известный как contents, от освобождения.Копирование не требуется.

0 голосов
/ 01 февраля 2012

это было добавление указателя «содержимого» к «outerArray» после того, как вы сделали [outerArray addObject: contents];

сохранение содержимого будет + 1,

, поэтому вы делаете

[содержимое выпуска]; содержание = ноль;

это просто заставляет содержимое сохранять -1 и позволяет содержимому (это указатель) указывать на ноль

NSLog (@ "Test at 0:% @ ", [test objectAtIndex: 0]);

не произойдет никаких ошибок

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