2009-12-29 1 views
2

У меня есть эта конкретная проблема, но если вы найдете мою первоначальную дизайнерскую идею с умом и иметь лучшее предложение, пожалуйста, дайте мне знать :)Проблемы отпуская объект с помощью «removeFromSuperView» iPhone

У меня есть UIView, который действует как контейнер/фон для добавления других видов. Важно то, что одновременно присутствует только одна точка зрения. Поэтому, прежде чем делать какие-либо добавления взглядов я делаю это:

 for(UIView *v in [self.currentView subviews]) { 

     [v removeFromSuperview]; 
    } 

self.currentView мнение я добавить свои подвидов в.

После этого добавить новый UIView таким образом:

 UIView *tempView; 

    switch (self.currentIndex) { 
     case 1: 
      tempView = [[AView alloc] initWithFrame:frame]; 
      [self.currentView addSubview:tempView]; 
      [tempView release]; 
      break; 
     case 2: 
      tempView = [[AView alloc] initWithFrame:frame]; 
      [self.currentView addSubview:tempView]; 
      [tempView release]; 
      break; 
     default: 
      break; 
    } 

Таким образом, я удалить все точки зрения, так как я выпускаю tempView сразу после того, как я добавить его в self.currentView я в конечном итоге с сохранить количество единиц в текущем проживании UIView в currentView.

Все это кажется прекрасным, но поскольку я смотрю на него с помощью инструментов, я вижу, что каждый раз, когда я запускаю вышеуказанный код, выделяется новый объект AView, а старый держится с сохранением числа 1, либо я я пропустил какое-то очевидное действие сохранения на моем объекте, иначе «removeFromSuperView» не вызывает «release» на моем представлении.

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

Как я могу прочитать из документации, «removeFromSuperView» должен вызвать «release» в представлении, поэтому я немного смущен, почему мои представления не освобождены.

Опять же, возможно, я собираюсь сделать это неправильно, и предложения действительно приветствуются. Настройка заключается в том, что в нижней части экрана есть несколько кнопок и когда пользователь нажимает на изменение вида.

Спасибо за любую помощь или указатели дали :)

+0

Если одновременно присутствует только один вид, то почему вы используете цикл для удаления представления? –

+0

Что это такое ... в синтаксисе? Я думал, что цель-с не поддерживает ... в. – martinr

+0

Привет и спасибо, ребята. Цикл for был главным образом для проверки по точке останова, сколько просмотров было удалено, оно всегда выполняется только один раз. Я вижу, что я меняю коллекцию, поскольку я перечисляю ее, и это может быть проблемой. Но разве это будет иметь значение? Код удаления запускается для единственного вида, который там живет ... Для этого нужно быть в порядке :) он работал до сих пор. Может ли это быть цикл, который сохраняет ссылку на объект? Еще раз спасибо – RickiG

ответ

2

Вы итерацию коллекции и одновременно изменяя его

Попробуйте

while ([self.currentView subviews].count>0) { 

    [[[self.currentView subviews] objectAtIndex:0] removeFromSuperView]; 
} 

вместо этого.

+0

Это был большой глоток какао: \t \t в то время как ([self.currentView подвиды] .count> 0) { \t \t \t \t \t \t UIView * v = [[self.currentView подвиды] objectAtIndex: 0]; \t \t \t [v removeFromSuperview]; \t \t} работал лучше. Но все же количество выделенных AViews увеличивается. Я начал использовать инструменты/объект. пометили «Созданный и все еще живой», а затем я постоянно запускал этот код, что может быть неправильным? – RickiG

+0

Наверняка вы хотите проверить список сохранения/выпуска с помощью инструментов и посмотреть на стеки, чтобы увидеть, какие объекты блокируют ваши AViews? Кажется, я помню, что Cmd + E полезен для ознакомления с этой информацией в Инструментах. Если вы еще не использовали эту функцию, попробуйте создать некоторые тривиальные подклассы NSObject для сравнения, чтобы вы могли сравнить то, что выглядит список аудиторских журналов, для полной версии и для неудачного [сохранить> 0)? Что вы видите, Рики? – martinr

+0

Я обновил свой Xcode до версии 3.2.1, и теперь кажется, что subviews действительно выпущены с помощью removeFromSuperView. Может быть, «не было ложки», а «Инструменты» просто не поняли. Я также запускал статический анализатор, и я бы предположил, что он сразу поймет потенциальную проблему такого рода. Но он вернулся чистым, поэтому я уверен, что утечки нет. Еще раз спасибо за ваш ввод :) – RickiG

0

вы можете попробовать функции «bringSubviewToFront» и «sendSubviewToBack» вместо создания нового UIView каждый раз. Таким образом, вы не будете создавать uiviews для каждого действия и, следовательно, будете менее нажимать на потребление памяти вашего приложения.

+0

Привет learner11, спасибо за ввод. У меня есть scrollView с X страницами, каждая из этих страниц может содержать Y приведенных выше представлений. Это означает, что если у меня есть 10 страниц и 6 из приведенного выше представления (страницы в направлении X направлений в направлении «Z»). Пользователь может потенциально иметь 60 просмотров в памяти за раз. Это главная причина, по которой я хочу убедиться, что полностью очищу все. Таким образом, пользователь может загружать максимум 10 x 1 просмотров и прокручивать их без какой-либо загрузки. Это хорошо в памяти, которую я хочу связать здесь. – RickiG