我正在努力让我的内存管理正确并且在下面的代码中,如果我包含最终版本声明(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];
非常感谢,
克里斯。
答案 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.