2012-05-22 7 views
3

В DetailViewController.h: @property (weak, nonatomic) IBOutlet UIImageView *recipeImage;UIImageView утечка памяти с ARC

В 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 вызывает утечку памяти

enter image description here

enter image description here

ответ

2

Хм. Я был немного удивлен этим, так как я не вижу никаких явных утечек в вашем коде. Поэтому я сделал небольшой тестовый проект (Xcode 4.3.2, iPhone simulator 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, не очень хороши в том, чтобы указывать на соответствующий код, поэтому я задаюсь вопросом, возможно ли, что ваша утечка может произойти из других источников.

Нижняя линия, я попытался воспроизвести вашу проблему, но не могу. Похоже, может потребоваться дальнейшая диагностика.

Update:

форматы файлы изображений удивительно сложные и если вы посмотрите на PNG description вы увидите десяток потенциальных областей, в которых алгоритм IOS может иметь утечку (либо из-за ошибки в прошивке логике или некоторой проблеме с файлом PNG). Понятно, что это не должно протекать, но очевидно, что некоторые подстановки, которые iOS ожидали или обрабатывали правильно. Кажется достойным http://bugreport.apple.com. Во всяком случае, я предлагаю открыть и сохранить файл PNG в выбранном графическом редакторе. У него есть шанс, который может исправить ситуацию.

+0

Эй, я сделал супер простой проект и продолжал находить утечки. Тем не менее, я переработал какой-то код, поэтому я попробую еще раз, не сделав этого. Кроме того, когда я комментирую self.recipeImage.image = tmp; утечка уходит (но тогда у меня нет изображения рецепта). Я использую класс рецепта и в представлении таблицы, который ведет к этому подробному контроллеру представления, он отправляет указатель на объект рецепта на контроллер подробного представления. Однако даже когда я не использую объект рецепта (просто нажмите контроллер подробного представления с тем же изображением для каждой ячейки), он все равно дает мне утечку памяти. Я попробую простой проект. – mlstudent

+0

Итак, я получил файлы с изображениями, которые я ссылаюсь на crestock (стоковые фотографии). Затем я попытался использовать одну и ту же фотографию crestock всегда вместо того, чтобы брать имя строки для каждого объекта рецепта: все еще протекает. Затем я попытался использовать фотографию без гроша: не просачивался. Почему один png утечка, а другой нет? Благодарю. – mlstudent

+0

Форматы файлов изображений на удивление сложны, и если вы посмотрите на [описание PNG] (http: //en.wikipedia.org/wiki/Portable_Network_Graphics) вы увидите десяток потенциальных областей, где алгоритм iOS может иметь ошибку и вызвать утечку. Понятно, что это не должно протекать, но очевидно, что некоторые подстановки, которые iOS ожидали или обрабатывали правильно. Кажется достойным http://bugreport.apple.com. Во всяком случае, я предлагаю открыть и сохранить файл PNG в выбранном графическом редакторе. У него есть шанс, который может исправить ситуацию. – Rob