ImageIO initImageJPEG实例已分配但从未释放

ale*_*lex 5 iphone uiimageview uiimage

我正在为iPhone开发一个应用程序,我发现以下代码导致内存分配增加.

    -(UIImage *)createRecipeCardImage:(Process *)objectTBD atIndex:(int)indx
{

[objectTBD retain];

// bringing the image for the background 
UIImage *rCard = [UIImage imageNamed:@"card_bg.png"];
CGRect frame = CGRectMake(00.0f, 80.0f, 330.0f, 330.0f); 

// creating he UIImage view to contain the recipe's data
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = rCard;

[rCard release];
imageView.userInteractionEnabled = YES;


float titleLabelWidth = 150.0;
float leftGutter = 5.0;
float titleYPos = 25.0;
float space = 3.0;
float leftYPos = 0;

// locating Title label
float currentHeight = [self calculateHeightOfTextFromWidth:objectTBD.Title :titleFont :titleLabelWidth :UILineBreakModeWordWrap];
UILabel *cardTitle = [[UILabel alloc]initWithFrame:CGRectMake(leftGutter, titleYPos, titleLabelWidth, currentHeight)];
cardTitle.lineBreakMode = UILineBreakModeWordWrap;
cardTitle.numberOfLines = 0;
cardTitle.font = titleFont;
cardTitle.text = objectTBD.Title;
cardTitle.backgroundColor = [UIColor clearColor];
[imageView addSubview:cardTitle];

[cardTitle release];

leftYPos = titleYPos + currentHeight + space;

// locating brown line
UIView *brownLine = [[UIView alloc] initWithFrame:CGRectMake(5.0, leftYPos, 150.0, 2.0)];
brownLine.backgroundColor = [UIColor colorWithRed:0.647 green:0.341 blue:0.122 alpha:1.0];
[imageView addSubview:brownLine];

[brownLine release]; 

leftYPos = leftYPos + 2 + space + space + space;

// creating the imageView to place the image
UIImageView *processPhoto = [[UIImageView alloc] initWithFrame:CGRectMake(leftGutter, leftYPos, 150, 150)];


if((uniqueIndex == indx) && (uniqueImg.imageData != nil))
{

    if([uniqueImg.rcpIden isEqualToString:objectTBD.iden])
    {
        objectTBD.imageData = [NSString stringWithFormat:@"%@", uniqueImg.imageData];
        [recipesFound replaceObjectAtIndex:indx withObject:objectTBD];


        NSData * imageData = [NSData dataFromBase64String:objectTBD.imageData];
        UIImage *rcpImage = [[UIImage alloc] initWithData:imageData];
        [imageData release];
        processPhoto.image = rcpImage;
        [rcpImage release];

    }


}
else if(objectTBD.imageData != nil)
{

    NSData * imageData = [NSData dataFromBase64String:objectTBD.imageData];
    UIImage *rcpImage = [[UIImage alloc] initWithData:imageData];
    processPhoto.image = rcpImage;
    [rcpImage release];
    [decodedBigImageDataPointers addObject:imageData];

}
else
{
    UIImage * rcpImage =  [UIImage imageNamed:@"default_recipe_img.png"];
    processPhoto.image = rcpImage;
    [rcpImage release];
}

NSlog(@" Process Photo Retain Count %i", [processPhoto retainCount]); // this prints a 1
[imageView addSubview:processPhoto]; 

NSlog(@" Process Photo Retain Count %i", [processPhoto retainCount]); // this prints a 2!!!!
//[processPhoto release];  // this line causes an error :( 



// converting the UIImageView into a UIImage
UIGraphicsBeginImageContext(imageView.bounds.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[objectTBD release];

for(UIView *eachSubview in imageView.subviews)
{
    [eachSubview removeFromSuperview];
    NSLog(@"each subview retainCount %i  despues", [eachSubview retainCount]);
    // here I find that the processPhoto view has a retain count of 2 (all other views have their retain count in 1)
}

return viewImage;

}
Run Code Online (Sandbox Code Playgroud)

当我检查仪器对象分配时,我发现"GeneralBlock-9216"长大了.

分解行我发现每次调用此代码时,都有一个实例:

2 0x5083800 00:18.534 ImageIO initImageJPEG
Run Code Online (Sandbox Code Playgroud)

正在分配.检查调用堆栈,突出显示以下行:

UIImage * objImage = [UIImage imageWithData:imageData];
Run Code Online (Sandbox Code Playgroud)

找到错误是什么帮助?

Tec*_*Zen 1

我认为您正在看到 UIImage 缓存图像。曾经有一种类似的方法可以initWithData:cache让你关闭缓存。现在我认为系统总是在幕后自动缓存图像,即使您已经释放了特定实例。

我不认为这是你的错误。我认为这是在 OpenGL 子系统中保存数据的系统。除非造成重大泄漏,否则我认为这不是问题。