NSMutableArray и управление памятью - PullRequest
0 голосов
/ 22 февраля 2011

Я изучаю Objective C на языке, который имеет сборку мусора, и я борюсь с управлением памятью. В частности, я борюсь с тем, что происходит в этом случае.

// Global variable
NSMutableArray *parentArray;

// Instance
- (void)testing {
  parentArray = [[NSMutableArray alloc] init]; 
  NSMutableArray *childArray = [[NSMutableArray alloc] init];

  [childArray addObject:@"mike"];
  [parentArray addObject:childArray];
}

childArray - указатель на массив, поэтому, когда я добавляю его в parentArray, он копирует или передает указатель? Если, как я думаю, он передает указатель, я не могу [childArray release] в этом методе, так как это уничтожит объект, и я не смог бы читать из него в другом месте.

Поэтому я должен освободить его в методе dealloc в конце класса?

Любая помощь очень ценится, когда я борюсь.

Mike

Ответы [ 5 ]

4 голосов
/ 22 февраля 2011

Вы можете освободить childArray в той же функции, потому что NSMutableArray сохраняет все добавленные объекты.

3 голосов
/ 22 февраля 2011

NSMutableArray (и все другие стандартные контейнеры target-c) сохраняют добавленные к ним объекты, поэтому вы можете освободить ваш childArray сразу после его добавления в parentArray.

Более того, немедленный выпуск улучшит читабельность вашего кода - так как ясно, что владение объектом переходит к parentArray.

0 голосов
/ 22 февраля 2011

Просто добавьте «autorelease» в объявлении childArray, чтобы массив был по возможности освобожден (childArray также будет освобожден при освобождении parentArray, которому принадлежит этот дочерний элемент).

// Global variable
NSMutableArray *parentArray;

// Instance
- (void)testing {
  parentArray = [[NSMutableArray alloc] init]; 
  NSMutableArray *childArray = [[[NSMutableArray alloc] init] autorelease];

  [childArray addObject:@"mike"];
  [parentArray addObject:childArray];
}

- (void) dealloc {
   [parentArray release];
}
0 голосов
/ 22 февраля 2011

addObject: просто добавьте указатель объекта и сохраните добавленный объект. когда removeObject: массив удаляет элемент (указатель), и элемент получит сообщение о выпуске.

  • когда вы NSMutableArray *childArray = [[NSMutableArray alloc] init];, значение childArray retainCount равно 1.
  • когда вы [parentArray addObject:childArray];, значение childArray retainCount равно 2.

когда retainCount равен 0, а памяти недостаточно, объект будет уничтожен.

есть такой же код:

NSMutableArray *parentArray;

parentArray = [[NSMutableArray alloc] init]; 
NSMutableArray *childArray = [[NSMutableArray alloc] init];
NSLog(@"1.childArray retainCount:%d",[childArray retainCount]);
[childArray addObject:@"mike"];
NSLog(@"2.childArray retainCount:%d",[childArray retainCount]);
[parentArray addObject:childArray];
NSLog(@"3.childArray retainCount:%d",[childArray retainCount]);
[parentArray removeAllObjects];
NSLog(@"4.childArray retainCount:%d",[childArray retainCount]);

результат:

1.childArray retainCount:1
2.childArray retainCount:1
3.childArray retainCount:2
4.childArray retainCount:1

попробуй, узнай.

0 голосов
/ 22 февраля 2011

когда вы добавляете childArray к parentArray, он сохраняется один раз.Таким образом, в этот момент у вас будет 2 одинаковых значения в подсчете удержания.Следовательно, вы можете легко освободить childArray в методе (тестирование) и сохранить ссылку в parentArray (retain count = 1).Тогда он не будет уничтожен.

...