3

在 DetailViewController.h 中:@property(weak, nonatomic) IBOutlet UIImageView *recipeImage;

在 DetailViewController.m

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.recipeTitle.text = rec.title;
    self.recipeDetail.text = rec.details;
    NSString *fileName = [NSString stringWithFormat: @"%@/%@", [[NSBundle mainBundle] resourcePath], rec.image];
    UIImage *tmp = [[UIImage alloc] initWithContentsOfFile: fileName];
    self.recipeImage.image = tmp;
    NSLog(@"%@", rec.image);
}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    recipeTitle = nil;
    recipeDetail = nil;
    recipeImage = nil;
    rec = nil;
}

由于某种原因 recipeImage UIImageView IBOutlet 导致内存泄漏

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

2

唔。我对此感到有些惊讶,因为我在您的代码中没有看到任何明显的泄漏。所以我做了一个小测试项目(Xcode 4.3.2、iPhone 模拟器 5.1、ARC、故事板),看看我是否可以重现你的问题并通过分析器运行它,瞧,没有发现泄漏。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.label1.text = @"Line 1";
    self.label2.text = @"Line 2";

    NSString *filename = [NSString stringWithFormat: @"%@/%@", [[NSBundle mainBundle] resourcePath], @"IMG_0999.PNG"];

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:filename];

    self.image1.image = image;
}

和你一样,我使用了弱属性:

@property (weak, nonatomic) IBOutlet UILabel *label1;
@property (weak, nonatomic) IBOutlet UILabel *label2;
@property (weak, nonatomic) IBOutlet UIImageView *image1;

我不认为 API 超出了泄漏范围(例如,我肯定在 Twitter API 中看到了一些泄漏),但我无法重现您的问题。

我觉得有一些合乎逻辑的可能性(这是一个延伸):首先,你的 PNG 有什么独特之处吗?也许与我们分享,我可以在我的测试中尝试一下。或者,也许您可​​以尝试其他一些 PNG 文件。或者你可以像我一样做,这是一个超级简单的项目,可以尝试重现泄漏,看看你是否在测试项目中遇到同样的问题。其次,泄漏可能在您的代码中的其他地方吗?我知道这些与 malloc 相关的泄漏并不适合将您指向相关代码,所以我想知道您的泄漏是否可能来自其他地方。

底线,我试图重现你的问题,但不能。看起来可能需要进一步诊断。

更新:

图像文件格式非常复杂,如果您查看PNG 描述,您会发现 iOS 算法可能存在泄漏的十几个潜在区域(可能是因为 iOS 逻辑中的错误,或者是 PNG 文件的一些问题)。显然,它不应该泄漏,但显然 iOS 确实预期或正确处理了一些排列。似乎值得http://bugreport.apple.com。无论如何,我建议在您选择的图形编辑器中打开并重新保存 PNG 文件。有一个外部机会可以解决它。

于 2012-05-23T01:57:05.843 回答