2010-08-19 118 views
1

这有一个有漏洞的代码块上的内存管理...试图了解iOS平台

NSString *filename = [NSString stringWithFormat:@"%@.png", sketchID]; 
CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext); 
UIImage* image = [[UIImage alloc] initWithCGImage:imageRef]; 
NSData* imageData = UIImagePNGRepresentation(image); 
  1. 他们在哪里?
  2. 一般来说,我怎么说,所以我不会在未来创建泄漏?
  3. 解决这些问题的正确方法是什么?

非常感谢!

回答

4

至于我可以告诉你,在memleaks:

CGImageRef imageRef = CGBitmapContextCreateImage(paintView.canvas.mBitmapContext); 

你需要调用CGContextRelease。检查this SO问题。

您还需要发布image。创建imageData后,执行:

[image release]; 

你不必释放fileName,因为你没有明确为它分配内存。当变量超出范围时它会自动释放。 Objective-C中有一些命名约定会告诉你何时需要发布以及何时不需要发布。查看Apple文档。

希望它有帮助。

+0

谢谢,巴勃罗。问题,为什么我不想释放imageData?或文件名? – BeachRunnerFred 2010-08-19 16:27:44

+0

更新了答案,并在文件名上加了一点点赞扬。完成后应该释放imageData。 – 2010-08-19 16:32:48

+0

再次感谢帕布罗。你确定我需要发布imageData吗?我想我不会释放imageData出于同样的原因,我不必释放fileName。你的想法? – BeachRunnerFred 2010-08-19 17:10:28

0

一般规则是,当您拨打alloc时,您需要相应的release。当您拨打autorelease时例外。另外,当您使用便利方法时,例如'stringWithFormat'。

+0

恩,你应该释放。 *除非你真的知道你在做什么,否则永远不会*明确地释放一个对象。 – 2010-08-19 19:45:56

+0

我的错误。我的意思是释放。 – Moshe 2010-08-19 20:30:28