Попытка повторно использовать переменную, чтобы избежать потери памяти - PullRequest
0 голосов
/ 11 октября 2010

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

Цель состоит в том, чтобы настроить этот объект TapDetectingImageView и поместить его в представление.Я сделаю это 8 раз, но с кодом ниже, только последний показывает.Я уверен, что что-то упустил, но что?;)

Представление, содержащее imageViews, является potatoeView.Я добавляю новый TapDetectingImageView через:

[potatoeView addSubview:imageView];

Что не так в этом коде?

for (int i = 0; i <= numberOfPotatoes-1; i++)
    {
        NSLog(@"potatoesView Generation : %d",i);

        NSArray *imgArray = [[NSArray alloc] initWithArray:[p objectAtIndex:i]];
        UIImage *img1 = (UIImage *) [imgArray objectAtIndex:0];
        UIImage *img2 = (UIImage *) [imgArray objectAtIndex:1];
        NSString *imgName = (NSString *) [imgArray objectAtIndex:2];

        if (imageView == nil) {
            imageView = [[TapDetectingImageView alloc] initWithImage:img1 imageHighlighted:img2];
        }else {

            [imageView setImage:(UIImage *)img1];
            [imageView setImageHighlighted:(UIImage *)img2];

        }

        [imageView setDelegate:self];

        // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList"

        CGRect rect = imageView.frame;

        rect.size.height = [potatoesSize floatValue] ;
        rect.size.width = [potatoesSize floatValue] ;

        imageView.frame = rect;

        [imageView setName:(NSString *)imgName];


        imageView.tag = i+1;    // tag our images for later use when we place them in serial fashion

        NSValue *val = [potatoesSizeAndPositions objectAtIndex:i];
        CGPoint point = [val CGPointValue];
        imageView.center = point;

        [potatoeView addSubview:imageView];

        [imgArray release];
    }

Ответы [ 2 ]

3 голосов
/ 11 октября 2010

Вы, кажется, в корне не понимаете, как нарисованы ваши взгляды. Когда вы настраиваете один и тот же экземпляр вида с восемью различными позициями и изображениями, он не «штампует» их все на каком-то холсте. Его состояние не будет запрашиваться до тех пор, пока основной цикл выполнения не дойдет до рисования вашего вида, после чего он запросит у вашего вида его рамку и содержимое и так далее, чтобы нарисовать его. Если вы хотите нарисовать восемь разных изображений с помощью UIViews, вам понадобится восемь разных представлений.

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

Вы только когда-либо создаете один вид, устанавливаете его как подпредставление, а затем меняете его n-1 раз. Бросьте if (imageView==nil) и создайте все 8 из них.

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