такое removeFromSuperview освобождает объект? - PullRequest
2 голосов
/ 03 декабря 2011

Я использую removeFromSuperview для удаления вида из его суперпредставления.Я также использую release после removeFromSuperview для этого объекта, иногда он работает нормально, но иногда дает плохой доступ.

- это removeFromSuperview, также вызывать release к объекту?

Ответы [ 4 ]

1 голос
/ 03 декабря 2011

Да, removeFromSuperview также освобождает представление.

Вам необходимо отключить представление после добавления его в суперпредставление.

CGRect frame; // let's assume you already have defined frame and superview
UIView *superview;

UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];

Или просто использовать autorelease, когдавы создаете представление.

UIView *subview = [[[UIView alloc] initWithFrame:frame] autorelease];
[superview addSubview:subview];

В обоих случаях вам не нужно звонить release после того, как вы позвоните removeFromSuperview.

0 голосов
/ 03 декабря 2011

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

Я полагаю, что тестирование показало бы, что removeFromSuperview освобождает представление, но вы не можете зависеть от этого поведения и никогда не должны предполагать, что это произойдет.Даже если это всегда происходит сейчас, это может произойти не в будущем.

Вам даже не нужно думать об управлении памятью на таком низком уровне, как этот.Если вы сохраняете объект с помощью retain или copy или alloc или new, то вы несете ответственность за противодействие этому с release в какой-то момент в будущем.

Если выне делайте ничего из этого, тогда вы не должны выпускать это.Методы добавления подпредставления в представление не содержат retain или copy в своем имени, и поэтому вы не должны освобождать его самостоятельно, когда удаляете из его суперпредставления.

Система просмотра очень сложна, особенно на iPhone с таким ограниченным объемом оперативной памяти и неадекватным объемом памяти для использования виртуальной памяти.Придерживайтесь правил, и у вас все будет хорошо.Или включите ARC.

0 голосов
/ 03 декабря 2011

На самом деле removeFromSuperview уменьшает свойство retainCount объекта просмотра и, таким образом, release.

Итак, если вы поступите так, как сказал Алексей.

UIView *subview = [[UIView alloc] initWithFrame:frame];
[superview addSubview:subview];
[subview release];

subview -> alloc = retainCount = +1,

subview -> addSubView = retainCount = +1

subview -> release = retainCount = -1.

subview -> removeFromSuperView = retainCount = -1

(подпредставление удалено из памяти)

0 голосов
/ 03 декабря 2011

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

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