Вопрос управления памятью - PullRequest
0 голосов
/ 12 октября 2010

Я хотел кое-что уточнить:

т. Е. Когда я добавляю UIVIEW в программный код другого UIVIEW.

т.е. [theview addsubview:thechildview];

Мне нужно освободить thechildview, потому что представление увеличивает счетчик хранения.

правый

Таким образом, в основном, если у меня есть цикл, и я использую этот цикл для инициализации подпредставлений и добавления подпредставлений в представление:

for(int i=0;i<10;i++){

    UIView *child = [UIview alloc]init.....
    [parent addSubview:child];
    [child release];
}

Мне все еще нужно освободить ребенка, верно? Так что это будет означать, что дочерний вид все еще имеет счет сохранения 1, верно?

Дело в том, что всякий раз, когда я вызываю релиз для ребенка после добавления, ребенок через некоторое время освобождается.

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

спасибо.

Ответы [ 2 ]

3 голосов
/ 12 октября 2010

Вы должны выпустить это где-нибудь, правильно.Вы можете удержать его и выпустить позже, но вы обязаны сделать это когда-нибудь.

Родительское представление сохранит / освободит свои дочерние элементы самостоятельно.Таким образом, если родительское представление будет освобождено, оно освободит свои дочерние представления.

Если дочернее представление будет удалено из его суперпредставления, оно также будет освобождено.

2 голосов
/ 12 октября 2010

Мне нужно освободить thechildview, потому что представление увеличивает счетчик хранения.

правый

Неправильно.

Вам необходимо освободить ChildView, если вы им владеете и если вы уже закончили его использовать. Независимо от того, решит ли мнение сохранить его или нет, это совершенно не имеет значения.

Так что, если мы посмотрим на ваш цикл

for(int i=0;i<10;i++){

    UIView *child = [UIview alloc]init.....
    [parent addSubview:child];
    [child release];
}

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

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

Мне все еще нужно освободить ребенка, верно? Так что это будет означать, что у дочернего представления все еще есть счет сохранения 1, верно?

Вы не можете предполагать что-либо о счете удержания. parent может привести к тому, что объект будет сохранен более одного раза, если он передаст его другим объектам. Возможно, он решит скопировать его, а не сохранять. Если ему не нужно хранить ссылку, он может вообще не сохранить ее.

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

Нет, вы поступаете правильно, выпуская его по окончании использования.

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