2012-04-26 2 views
0

Мое приложение падает, когда я устанавливаю свойство изображения в UIImageView три раза подряд (иногда бывает два раза). Несколько раз я видел предупреждение о памяти перед тем, как приложение закрывается, но в большинстве случаев оно просто разрушается. Приложение не сбой в симуляторе, поэтому я уверен, что это проблема с памятью.Приложение вылетает, когда UIImageView.image установлен в 2-3 раза

Вот код, я использую при установке свойства изображения:

-(void)changeBgPictureTo:(UIImage *)img 
{ 
    [self.backgroundImage setImage:img]; 
} 

В UIImages выделяется с [UIImage imageWithData:] способом:

[UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]]; 

Изображение установлен правильно первые два раза, но аварии в третий раз. Это не имеет никакого отношения к конкретному файлу изображения. Я пробовал с 10 различными изображениями, и это не имеет никакого значения.

Как заставить UIImageView выгружать предыдущие загруженные изображения?

EDIT: Хорошо, я просил весь код так вот он идет:

Я работаю с классом, который выглядит следующим образом:

@interface MyImage : NSObject 
{ 
    UIImage* image; 
    int imgId; 
    NSArray* colors; //contains 'UIColor' objects. 
} 

@property (nonatomic, retain) UIImage* image; 
@property (nonatomic, retain) NSArray* colors; 
@property (nonatomic, readwrite) int imgId; 

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imgId andColors:(NSArray*)colorArray; 

@end 

Вот реализация INIT:

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imageId andColors:(NSArray*)colorArray 
{ 
    self = [super init]; 

    if (self) 
    { 
     self.colors = [NSArray arrayWithArray:colorArray]; 
     self.imgId = imageId; 
     self.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]]; 
    } 

return self; 

}

У меня есть datacontroller, который имеет список объектов «MyImage», который добавляется в цикле с этим вызовом:

[self.myImages addObject:[[MyImage alloc] initWithFileName:[NSString stringWithFormat:@"0000%d", i] withType:@"jpg" andId:i andColors:colors]]; 

У меня есть 9 изображений, который назван 00001.jpg, 00002.jpg, ... .., 00008.jpg.

Этот контроллер данных имеет метод следующим образом:

-(MyImage *)getImageWithId:(int)imgId 
{ 
    for (MyImage* img in self.myImages) 
    { 
     if (img.imgId == imgId) 
      return img; 
    } 
    return nil; 
} 

Метод getImageWithId называется так:

-(void)btnPushed:(id)sender 
{ 
    [self.delegate changeBgPictureTo:[self.imgDataController getImageWithId:((UIButton*)sender).tag]];  
} 

Метод changeBgPictureTo является метод, который делает настройку изображения-свойства :

-(void)changeBgPictureTo:(MyImage *)img 
{ 
    NSLog(@"Setting image: %d", img.imgId); 
    [self.backgroundImage setImage:img.image];  
} 

Отпечаток журнала «Установочное изображение: 0000X:» три раза, b ut аварийно завершает работу после третьей печати.

+1

вы пробовали установить его на ноль, прежде чем загружать новое изображение .. я имею в виду imageView.image = nil; – vishy

+0

Да, это не имеет значения. Он по-прежнему сбой :( –

+0

Что вы видите в журнале при его сбое? Какой тип сбоя происходит? – DBD

ответ

2

Вместо того, чтобы хранить объект UIImage внутри класса MyObject, попробуйте хранить только имя файла.

@interface MyImage : NSObject 
{ 
    NSString *fileName;//UIImage* image; 
    int imgId; 
    NSArray* colors; //contains 'UIColor' objects. 
} 

@property (nonatomic, retain) NSString *fileName;//@property (nonatomic, retain) UIImage* image; 
@property (nonatomic, retain) NSArray* colors; 
@property (nonatomic, readwrite) int imgId; 

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imgId andColors:(NSArray*)colorArray; 

и реализация

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imageId andColors:(NSArray*)colorArray 
{ 
    self = [super init]; 

    if (self) 
    { 
     self.colors = [NSArray arrayWithArray:colorArray]; 
     self.imgId = imageId; 
     //self.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]]; 
     self.fileName = [[NSBundle mainBundle] pathForResource:fileName ofType:type]]; 
     } 
     return self; 
} 

затем в функции

-(void)changeBgPictureTo:(MyImage *)img 
{ 
    NSLog(@"Setting image: %d", img.imgId); 
    //[self.backgroundImage setImage:img.image];  
    UIImage *img = [UIImage imageWithContentsOfFile:[img fileName]]; 
    [self.backgroundImage setImage:img]; 
} 
+0

Это решило мою проблему, спасибо :) –

+1

Вы также можете добавить исправление @ sky1224, чтобы исправить утечку памяти. – nhisyam

0

попробовать, используя ниже, чтобы получить изображение из комплекта

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"yourImageName.png" ofType:nil]]; 
+0

Без изменений. Все еще падает. –

+0

может указать размер изображений – vishy

+0

Между 300 КБ и 450 КБ. Ничего огромного. –

0

Возможен ли, что когда вы получаете низкую память предупреждения отпускания определенного свойства, а затем попытаться использовать его, но вы работаете с нолем?

Вы пробовали имитировать предупреждение о низкой памяти в симуляторе, чтобы увидеть, если он сработает? Оборудование> Имитация памяти Предупреждение

+0

Да, я пробовал использовать Simulate Memory Warning. Не похоже, что это связано с моей катастрофой. –

2

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

[self.myImages addObject:[[MyImage alloc] initWithFileName:[NSString stringWithFormat... 

Этот код должен быть -

MyImage* img = [[MyImage alloc] initWithFileName:[NSString stringWithFormat... 
[self.myImages addObject:img]; 
[img release]; 

ИЛИ использовать autorelease.

Ваш код должен получать утечки памяти.

Смежные вопросы