Автоматический подсчет ссылок и финализация - PullRequest
0 голосов
/ 07 февраля 2012

Быстрый вопрос: я использую множество классов, производных от NSObject, и мне интересно, как правильно очистить свойства классов, которые могут иметь экземпляры других классов (в приведенном ниже фрагменте это массив пользовательских экземпляров классов).Является ли мое использование new и finalize ниже правильным?

Насколько я понимаю, new - это удобный метод, который вызывает alloc и init, и finalize вызывается до dealloc - впо крайней мере, это то, что я почерпнул из чтения документов.У меня есть это право?

Спасибо за любые советы / лучшие практики и т. Д.

- (id)new {
waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount];

    for (int i = 0; i < kCellCount;  i++) {
        WaffleCell * cell = [WaffleCell new];
        [waffleArray addObject:cell];
     }

    return self;
}

// clean up
- (void)finalize {

    [waffleArray removeAllObjects];
     waffleArray = nil;

    [super finalize];
}

1 Ответ

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

new on NSObject - это метод класса, а не метод экземпляра, как у вас. Кроме того, я не понимаю, почему вы перегружаете new. Чаще всего перегрузка init происходит примерно так:

- (id)init {
    if ((self = [super init])) {
        waffleArray = [[NSMutableArray alloc] initWithCapacity:kCellCount];

        for (int i = 0; i < kCellCount;  i++) {
            WaffleCell * cell = [WaffleCell new];
            [waffleArray addObject:cell];
        }
    }
    return self;
}

Что касается finalize, вам действительно не нужно этого делать. Вот что Apple говорит об этом:

Сборщик мусора вызывает этот метод на приемнике перед удалением используемой памяти. Когда сборка мусора включена, этот метод вызывается вместо dealloc.

С включенным ARC вам не нужно ничего делать, и поскольку сборщик мусора все равно не будет работать, finalize не будет вызван в любом случае. ARC автоматически сгенерирует код, который будет release waffleArray в dealloc для вас, что достаточно для правильного управления памятью в этом случае, потому что счетчик хранения waffleArray затем упадет до 0, будет освобожден сам, что будет идти и освободить объекты в массиве.

...