Освобождение объекта из-за сохранения счета - PullRequest
0 голосов
/ 12 октября 2010

У меня проблема с выпуском представления слишком много раз. Хотя в теории все просто, потому что я перевожу uiview в uiview, который является подклассом uiview, будучи анимированным и так далее, это не то, что я легко могу исправить. Он падает только 10% и только при определенных условиях и только 30% времени даже при этих условиях.

Другими словами, это своего рода комплекс. Иногда в моем методе dealloc счетчик сохранения этого UIView уже равен 1 (который освобождается при освобождении представления), и поэтому его не следует освобождать снова. Итак, что я сделал, это:

if ([mainView retainCount] > 1) {
    NSLog(@"released");
    [mainView release];
}

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

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

РЕДАКТИРОВАТЬ: Если нет, то как лучше скопировать один UIView в другой UIView?

mainView = newView;
[newView release];

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

Ответы [ 3 ]

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

Не используйте значение retainCount.

Серьезно, вы не должны никогда использовать это значение для чего-то действительно полезного.

Если у вас есть утечки памяти или вы столкнулись с перебоями из-за переизданий, исправьте их - это ошибки! И это не способ справиться с ними.

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

1 голос
/ 31 октября 2010

Не используйте -retainCount.

Абсолютный счет сохранения объекта не имеет смысла.

Вы должны вызывать release ровно столько раз, сколько вы вызывали сохранение объекта,Не меньше (если вам не нравятся утечки) и, конечно же, больше нет (если вам не нравятся сбои).

См. Рекомендации по управлению памятью для получения полной информации.

В данном конкретном случае, release объект, который вы не сохранили, является рецептом катастрофы.Если это не произойдет сбой сейчас, это когда-нибудь произойдет, возможно, из-за обновления программного обеспечения или, казалось бы, не связанных изменений.Это может работать только сейчас, потому что ваше управление памятью не везде правильно.

Как было сказано, это:

mainView = newView;
[newView release];

Не делает копию представления.Хуже того, он чрезмерно освобождает представление (потому что вы нигде его не сохраняете).

Использование метода copy для представлений не является правильным решением или, по крайней мере, будет крайне нетипичным.Элементы пользовательского интерфейса не копируются таким образом.

Вы пробовали build and analyze и исправили все ошибки, которые на это указывают?

leaks может ничего не показывать, поскольку все еще может быть указатель наутечка объекта, плавающего в доступной памяти.

0 голосов
/ 12 октября 2010
mainView = newView;

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

...