开发者

Custom UIView Leaking Memory - iPhone/iPad/iOS App Development

I have a viewcontroller that repeatedly repositions 6 items within a uiscrollview. However, even though I've limited the number of items within the uiscrollview to 6, I'm still leaking memory when i update their position and their image. Can someone let me know if the following code which represents a unit within the uiscrollview is properly coded? startLoad is the method that I call after to reload the image.

#import "ScrollUnit.h"

@implementation ScrollUnit
@synthesize index;
@synthesize ProductToDisplay;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {开发者_运维知识库
        // Initialization code.
    }
    return self;
}        

-(void)startLoad
{   
    [imageview removeFromSuperview];
    [imageview release];

    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                        initWithTarget:self
                                              selector:@selector(loadImage) 
                                                object:nil];

    [queue addOperation:operation];
    [operation release];
}

-(void)loadImage 
{
    NSString *myimageName = [self.ProductToDisplay valueForKey:IMAGEKEY];
    NSString *myimageUrl = [NSString stringWithFormat:@"%@/%@",IMAGE_SERVICE,myimageName];

    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:myimageUrl]];

    UIImage* image = [[[UIImage alloc] initWithData:imageData] autorelease];
    [imageData release];
    [self performSelectorOnMainThread:@selector(displayImage:) withObject:image waitUntilDone:NO];
}

- (void)displayImage:(UIImage *)image 
{   
    imageview = [[[UIImageView alloc] initWithFrame:CGRectMake(9, 0, 320, 320)]retain];
    imageview.contentMode = UIViewContentModeScaleAspectFit;
    imageview.backgroundColor = [UIColor whiteColor];
    imageview.image = image;
    [self addSubview:imageview];
    [imageview release];
    //[image release];
}

- (void)dealloc {
    [super dealloc];
}

@end


Get rid of the retain message on this line and you should be all set:

imageview = [[[UIImageView alloc] initWithFrame:CGRectMake(9, 0, 320, 320)]retain];

The reason why you need to do this is because you already own the object by calling alloc, so at that point, the relative reference count is 2.

Once you invoke addSubview:, passing in the imageview, the reference count gets bumped to 3, then right back down to 2 once you release it on the next line.

So once that object gets sent release in -dealloc, you're still stuck because the reference count is now 1, not 0 as you expected.


There is also another little thing that might bug (or not). You don't release imageview before you assign it in displayImage method. As long as only startLoad is called you are fine but if displayImage is called from the outside then you still leak.

You might want to use a property with retain and then synthesis the getter and setter methods. This way the iOS will release your previous assignment before it retains your new assigned object. That said then you need to release created image view right were you create it and you have to use "self.imageview" in order to make sure that you use the setter (setImageview).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜