iOS addSubview& removeFromSuperview导致内存泄漏

时间:2013-07-07 11:05:48

标签: iphone ios memory-management

我有以下问题:

我有一个扩展UIViewController类的类的实例,在这个类中我将UIImage添加到UIImageView,然后使用这个方法“addSubview:”[self.view addSubview:imageView]将UIImageView添加到self.view中。最后使用[[[UIApplication sharedApplication] keyWindow] addSubview:[self view]]将self.view添加到窗口,当我点击关闭按钮时,我正在清除self.view(删除子视图“UIImageView”)和从窗口中删除self.view。

现在的问题是,当我使用相同的实例将其他UIImageView添加到其他图像时,即使我已经释放它们并将它们从superview中删除,第一个数据也不会从内存中释放出来。以下代码说明了问题。

- (void) setImageWithURL: (NSString *)url {

    NSData * imageData =NSData * imageData =[NSData dataWithContentsOfURL:[NSURL URLWithString:url]];

    if (imageData) {
            UIImage *image = [[UIImage alloc]initWithData:imageData];
            [[[UIApplication sharedApplication] keyWindow] addSubview:[self view]];
            [self createViewWithImage:image];
            [image release];
}

-(void) createViewWithImage: (UIImage *) image{
    [self.view setHidden:false];
     UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
     [self.view addSubview:imageView];
     [imageView release];
}

// for removing the imageView when i click on close button
-(void) closeView{
            for (UIView *subView in self.view.subviews) {
                  [subView removeFromSuperview];
             }
            [self.view removeFromSuperview];

}

注意:我使用xcode工具测试内存分配。

更新: 经过更多的研究..它不是addSubview& removeFromSuperview使内存泄漏..它的NSData。我不知道为什么它没有从记忆中释放出来。我做了一些更改来测试它是否真的是NSData,我在本地保存图像并使用两种情况设置图像:

//Case 1:
NSString *path = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
NSData * imageData =[[NSData dataWithContentsOfFile:path];
image = [[UIImage alloc]initWithData:imageData];


//Case 2:

NSString *path = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"];
image = [[UIImage alloc] initWithContentsOfFile:path];

我发现案例1使内存泄漏,而案例2是干净的。

现在UIImage无法在不使用NSData的情况下拍摄图像,并且由于某种原因NSData未发布..所以我该如何解决这个问题!!!!

1 个答案:

答案 0 :(得分:0)

你有:

[super dealloc];

在你的派生类的dealloc中?