何时发布UIImage和NSString Resources

时间:2011-03-31 12:21:39

标签: iphone objective-c memory-management nsstring uiimage

我正在努力让我的内存管理正确并且在下面的代码中,如果我包含最终版本声明(filePath),它会崩溃,我看不清楚原因。我已经分配了它,所以我为什么不释放它呢?

再往下,我将cellAbout返回到TableView。

有人可以解释一下吗?

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
filePath = [filePath stringByAppendingString:@".png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
imageView.image = image;
[image release];
[filePath release];

非常感谢,

克里斯。

4 个答案:

答案 0 :(得分:1)

你在这里泄漏,然后发布一个自动释放的字符串:

filePath = [filePath stringByAppendingString:@".png"];

如果你真的想手动释放,请保存指针:

NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
NSString *somestring = [filePath stringByAppendingString:@".png"];
[filePath release];

答案 1 :(得分:1)

您的问题

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];

在此行之后泄露filePath。

filePath = [filePath stringByAppendingString:@".png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
imageView.image = image;
[image release];

在此行之后释放自动释放的对象。

[filePath release];

<强>代替

UIImageView *imageView = (UIImageView *)[cellAbout viewWithTag:2];
NSString *filePath = [[NSString alloc] initWithString:self.gem.poiType];
NSString *extendedFilePath = [filePath stringByAppendingString:@".png"];
[filePath release];
UIImage *image = [[UIImage alloc] initWithContentsOfFile: extendedFilePath];
imageView.image = image;
[image release];

答案 2 :(得分:1)

答案是原始的filePath字符串是IS分配的,需要释放,但是当你有这行时:

  filePath = [filePath stringByAppendingString:@".png"];

你创建了一个不同的字符串 - 现在指向filePath的原始指针已经消失并且是一个泄漏。

以下是您真正想要的代码

 NSString *filePath = self.gem.poiType;
 filePath = [filePath stringByAppendingPathExtension:@"png"];
 UIImage *image = [[UIImage alloc] initWithContentsOfFile: filePath];
 imageView.image = image;
 [image release];

所以你不需要发布filePath - 它是自动发布的。此外,苹果还特别要求添加路径扩展。

 NSString *filePath = [self.gem.poiType stringByAppendingPathExtension:@"png"];

实际上是大多数人会编写代码的方式 - 少一行。

答案 3 :(得分:1)

[NSString stringByAppendingString]会返回一个新字符串,这就是您泄漏旧字符串的位置。

然后你不再拥有filePath,所以当你稍后发布它时,你会崩溃。

你可以回避这一切:

NSString *filePath = [NSString stringWithFormat:@"%@.png",self.gem.poiType];// don't release me.