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