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;
}

何らかの理由で、recipeImageUIImageViewIBOutletがメモリリークを引き起こしています

ここに画像の説明を入力してください

ここに画像の説明を入力してください

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 に答える