Objective C Массив и Выпуск Объекта - PullRequest
7 голосов
/ 12 марта 2010

У меня есть вопрос новичка относительно того, когда выпустить элементы NSArray. Смотрите следующий псевдокод:

NSMutalbeArray *2DArray = [[NSMutableArray alloc] initWithCapacity:10];
for (int i=0;i<10;i++) {
  NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5];
  for (int j=0;j<5;j++) {
    MyObject *obj = [[MyObject alloc] init];
    [array addObject:obj];
    [obj release];
  }

  [2DArray addObject:array];
  [array release];
}
// use 2DArray to do something

[2DArray release]

Мой вопрос заключается в том, что когда я выпускаю 2DArray, нужно ли сначала явно освобождать каждый его элемент (массив)? Кроме того, прежде чем освободить объект «массив», нужно ли мне сначала освобождать каждый его элемент (MyObject)?

Я новичок в Задаче С. Пожалуйста, помогите. Благодарю.

Ответы [ 3 ]

15 голосов
/ 12 марта 2010

Нет, вам не нужно указывать каждый объект как release d. Когда вы отправляете метод release на NSArray, он автоматически отправляет метод release каждому элементу внутри вначале.

Итак, в вашем случае вы отправляете [2DArray release]. Это автоматически отправляет [array release] каждому другому массиву, который отправляет [obj release] каждому объекту внутри каждого array.

4 голосов
/ 12 марта 2010

Вам не нужно освобождать сохраненные объекты. NSArray сохраняет их при добавлении и освобождает их при освобождении. Поэтому, если вы выделяете, добавляете в массив, а затем освобождаете, объект в массиве будет иметь счет сохранения 1. Как только массив освобожден, объект освобожден, следовательно, освобожден.

2 голосов
/ 12 марта 2010

Когда объект создается, он имеет счет сохранения 1. При каждом добавлении объекта в массив его счет хранения увеличивается (в данном случае до 2). После добавления в массив ваш код освобождает удержание объекта, уменьшая количество сохраненных объектов на 1 (в данном случае до 1). Затем, когда вы освобождаете массив, он вызывает release для всего, что в нем, сбрасывая их счетчики хранения на 1 (до 0 в данном случае). Когда значение счетчика достигает 0, объект освобождается.

Ваш код выглядит правильно с точки зрения управления памятью.

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