2

我有以下问题:

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

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

- (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 没有发布..所以我该如何解决这个问题!!!!

4

1 回答 1

0

你有没有:

[super dealloc];

在你的派生类的dealloc中?

于 2013-07-07T13:17:06.477 回答