Невозможно выделить новый экземпляр подкласса UIView после освобождения - PullRequest
0 голосов
/ 30 ноября 2009

У меня есть переменная экземпляра * TangramLevel (: UIView) currentLevel; в моем классе viewController, и у меня есть экземпляр, выделенный при запуске (это retainCount 1). Я прикрепил его к представлению [self.view addSubview: currentLevel]; (retainCount 2).

Когда уровень заканчивается, он уведомляет контроллер, поэтому контроллер удаляет его из представления [currentLevel removeFromSuperview]; (retainCount 1) и освобождает выделенный экземпляр - [currentLevel release]; -, чтобы освободить его (retainCount 0 = invote dealloc).

Затем на следующей строке контроллер хочет выделить / добавить представление нового уровня с данными другого уровня, но приложение вылетает (EXEC BAD ACCESS).

Если я не освобождаю currentLevel после removeFromSuperview, приложение работает, но в памяти остается неиспользованный экземпляр уровня, что также является проблемой (сама по себе основная проблема).

Есть ли какая-либо ошибка в методе, который я написал выше? Или ошибка в другом месте, может быть, в классе уровня? Я выделил некоторый UIImageView на уровне, но я освобождаю каждый выделенный объект в методе levelloc уровней. Есть идеи?

1 Ответ

1 голос
/ 30 ноября 2009

Разместите свой код.

Это определенно проблема управления памятью. Вопрос в том, где проблема? Чтобы ответить на это, нам нужно изучить следующее:

  1. Ваш код обработки "currentLevel" iVar (вы использовали синтезированные свойства и т. Д.). Опубликовать это.
  2. Как вы назначаете представление для currentLevel?
  3. Где именно вы это выпускаете?
  4. Как реализован dealloc вашего представления (что вы выпускаете и как)?
  5. Есть ли другой код, который сохраняет / освобождает это представление или что-нибудь связанное с ним?

Тот факт, что вы называете release в своем коде "Я закончил с этим уровнем, давайте перейдем к следующему", наводит на мысль о общей проблеме проектирования. Сделайте управление памятью каждого из iVars класса ответственным за его средства доступа и используйте ТОЛЬКО средства доступа для взаимодействия с ним (даже внутри класса / экземпляра). С синтезированными свойствами это делает его невероятно простым. Таким образом, вам не нужно беспокоиться о том, где сохранить / выпустить iVars, потому что он всегда направляется через средства доступа.

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