Массив Objective C и объектный выпуск

У меня есть вопрос о новичке относительно того, когда выпустить элементы 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) сначала?

Я плохо знаком с Objective C. Помогите.спасибо.

7
задан Brandon Bodnar 12 March 2010 в 19:18
поделиться

3 ответа

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

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

15
ответ дан 6 December 2019 в 08:42
поделиться

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

4
ответ дан 6 December 2019 в 08:42
поделиться

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

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

2
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: