Задача C (Iphone) вопрос о выпуске - PullRequest
2 голосов
/ 09 сентября 2010

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

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

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

Ответы [ 4 ]

8 голосов
/ 09 сентября 2010

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

Это может помочь вспомнить "NARC" - если вы вызываете метод для объекта, который включает слово "n ew "," a lloc "," r etain "или" c opy ", вам необходимо освободить его.Как видно из приведенного выше кода, только alloc соответствует требованиям.Поскольку вы только NARCed это один раз, вам нужно только выпустить его один раз.

3 голосов
/ 09 сентября 2010

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

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

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

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

2 голосов
/ 09 сентября 2010

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

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

0 голосов
/ 09 сентября 2010

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

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

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

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

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