尝试重用变量以避免遗弃的内存

时间:2010-10-11 04:34:25

标签: iphone cocoa-touch memory-management uiimageview

我有一个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 个答案:

答案 0 :(得分:3)

您似乎从根本上误解了您的观点。当您使用八个不同的位置和图像设置相同的视图实例时,它不会在某些画布上“标记”它们。在主运行循环开始绘制视图之前,不会查询其状态,此时它会询问您的视图的框架和内容等等以便绘制它。如果你想用UIViews绘制八个不同的图像,你需要八个不同的视图。

答案 1 :(得分:1)

您只创建一个视图,将其设置为子视图,然后将其更改n-1次。删除if (imageView==nil)并创建所有8个。