У меня есть вопрос о новичке относительно того, когда выпустить элементы 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. Помогите.спасибо.
Нет, вам не нужно указывать каждому объекту выпуск
d. Когда вы отправляете метод release
в NSArray
, он сначала автоматически отправляет метод release
каждому элементу внутри.
Итак, в вашем случае вы отправляете [2DArray release]
. Это автоматически отправляет [выпуск массива]
каждому другому массиву, который отправляет [выпуск объекта]
каждому объекту внутри каждого массива
.
Вам не нужно освобождать сохраненные объекты. NSArray сохраняет их при добавлении и освобождает при выпуске. Итак, если вы выделяете, добавляете в массив, а затем освобождаете, объект в массиве будет иметь счетчик сохранения 1. Как только массив будет освобожден, объект будет освобожден, а значит, освобожден.
Когда объект создается, он имеет счетчик сохранения 1. Каждый раз, когда объект добавляется в массив, его счетчик сохранения увеличивается (в данном случае к 2). После добавления в массив ваш код освобождает удерживание объекта, уменьшая его счетчик удержаний на 1 (в данном случае до 1). Затем, когда вы освобождаете массив, он вызывает release для всего в нем, сбрасывая их счетчики удержания на 1 (в данном случае до 0). Когда счетчик сохранения достигает 0, объект освобождается.
Ваш код выглядит правильно с точки зрения управления памятью.