2010-09-09 2 views
2

Если я создаю представление и добавляю его в качестве подзаголовка, а также добавляю его в массив, должен ли я его дважды выпустить?Задача C (iphone) вопрос о выпуске

UIView* cat = [[UIView alloc] initWithFrame:someFrame]; 
    [self.view addSubview:cat]; 
    [self.animals addObject:cat]; 
    [cat release]; 
    [cat release]; 

Мне просто кажется странным, что у меня есть 2 заявления о релизе, и я не видел, чтобы люди это делали. Но не увеличивает ли счет удержания на 2 в этом случае?

ответ

8

У вас должен быть только один release - для балансировки alloc. Ни addSubView:, ни addObject: не дают владельцу право собственности на объект, поэтому вызывающему абоненту не нужно балансировать их с помощью release. Чтение memory management guide должно очистить все это для вас.

Это может помочь вспомнить «NARC» - если вы вызываете метод объекта, который включает в себя слово «п РЭБ», « Lloc», «г Этейн» или "с opy ", вам нужно его освободить. Как вы можете видеть в своем коде выше, только alloc подходит для счета. Поскольку вы только NARCed его один раз, вам нужно только выпустить его один раз.

+0

Спасибо, я запомню это. – sol

2

Когда кошка добавляется в self.view, тогда self.view владеет кошкой, и она несет ответственность за освобождение кошки. Это то же самое, что и для self.animals. Self.animals владеет кошкой. Когда self.animals будет выпущен, он освободит все принадлежащие ему объекты.

Итак, вы должны освободить кошку только одну. Потому что в вашем блоке кода у вас есть только одна кошка, а не две.

+0

ok один последующий вопрос тогда - делает self.animals = nil освобождает кошку? – sol

+0

Я предполагаю, что ваши животные являются структурой NSArray. Когда массив животных освобождается, все объекты внутри массива получат сообщение о выпуске. Итак, кошка на животных будет выпущена. – AechoLiu

3

В дополнение к тому, что написал Чак:

Это не то, что вы отпускаете, потому чтоaddSubview: или addObject:может/не может увеличить количество сохранить.

Это совершенно неправильный способ взглянуть на него. Если self.viewretain s ваш объект, это обязанность освободить его правильно, и вам ничего не нужно.

Это , потому что вы создали объект поallocвам необходимо его освободить.

0

Как уже упоминалось, вам не нужно выпускать его дважды; один раз - все, что требуется. Однако вы не должны выпустить его на всех, если вы используете autorelease:

UIView* cat = [[[UIView alloc] initWithFrame:someFrame] autorelease]; 
[self.view addSubview:cat]; 
[self.animals addObject:cat]; 

Объект кот будет выпущен к концу цикла RunLoop. Использование autorelease сделает ваш код более чистым и более способным справиться с изменениями.

Также вам не нужны самоопределители на виду и животных, если вы не хотите отличать их от объектов с локальным охватом (также было бы плохой практикой иметь переменные с локальным охватом, называемые такими же, как члены ваших классов).