iphone объект c является объектом, уже выпущенным - PullRequest
1 голос
/ 16 августа 2010

я выпускаю изображение с [myimageview.image release];

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

thankx chris

EDIT После нескольких жалоб на мое плохое кодирование :) вот пример:

Сначала я инициализирую массив с путем к множеству полноэкранных изображений. Также имеется около 10 различных массивов для 10 различных сцен.Когда я помещал изображения непосредственно в массив, ему просто нужно было много памяти с самого начала, или когда я полностью выпустил сцену, мне нужно было снова загрузить весь массив изображений, и это происходило медленно.Поэтому я просто загружаю путь к изображениям в массив и присваиваю каждую картинку в цикле моему изображению во время выполнения.

Инициализация один раз: imageArray_stand = [[NSArray alloc] initWithObjects: @ "FrankieArmeRaus_0001.jpg",... до 60 изображений @ "FrankieArmeRaus_0061.jpg", nil];

В цикле, который вызывается каждые 1/10 секунды:

      if ([myimageview.image  retainCount] > 1) 
        //if ( myimageview.image != nil) // does not work = crash
        {   
             [myimageview.image release]; 
              myimageview.image = nil;
        }

        myimageview.image = [UIImage imageNamed:[imageArray_stand2 objectAtIndex:piccounter-1]];

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

Я рад любому решению (просто СЕЙЧАС оно работает), которое лучше.Даже для полной загрузки всех изображений в массив, но, как уже упоминалось, для этого требуется много памяти и переназначение, а для выполнения требуется длительное время загрузки.(1 секунда для 50 изображений)

Кроме того, мне нужно было RELASE и установить значение NIL, потому что в противном случае это даже привело бы к превышению моего использования памяти.

Ответы [ 3 ]

2 голосов
/ 16 августа 2010

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

0 голосов
/ 16 августа 2010

решил это с

if ([myimageview.image retainCount]> 1) [myimageview.image release];

0 голосов
/ 16 августа 2010

Самый простой способ - сделать что-то вроде этого:

if (someObject != nil)
{
    [someObject release];
    someObject = nil;
}

Однако я не думаю, что вы должны выпускать myimageview.image, предполагая, что myimageview - UIImageView.UIImageView отвечает за управление своим изображением;Вы не должны возиться с его счетом удержания.

Может быть, вы действительно хотите сделать следующее:

myimageview.image = nil;

Это заставит myimageview освободить его и перестать указывать на недопустимую память.

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