当我连续三次在UIImageView上设置image-property时,我的应用程序崩溃了(有时两次就足够了)。有几次我在应用程序关闭之前看到了内存警告,但大多数时候它只是崩溃了。该应用程序不会在模拟器中崩溃,所以我很确定这是一个内存问题。
这是设置图像属性时使用的代码:
-(void)changeBgPictureTo:(UIImage *)img
{
[self.backgroundImage setImage:img];
}
UIImages分配了[UIImage imageWithData:]
方法:
[UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]];
前两次图像设置正确,但第三次崩溃。它与特定的图像文件无关。我尝试了10种不同的图像,但没有区别。
如何让UIImageView卸载以前加载的图像?
修改 好的,我已经被要求提供完整的代码了,所以在这里:
我正在使用一个看起来像这样的课程:
@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:”三次,但在第三次打印后不久就崩溃了。
答案 0 :(得分: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];
}
答案 1 :(得分:2)
至少应该在添加到图像数组后释放这些MyImage实例。
[self.myImages addObject:[[MyImage alloc] initWithFileName:[NSString stringWithFormat...
此代码应为 -
MyImage* img = [[MyImage alloc] initWithFileName:[NSString stringWithFormat...
[self.myImages addObject:img];
[img release];
或使用自动释放。
您的代码应该会出现内存泄漏。
答案 2 :(得分:0)
尝试使用以下内容从包中获取图像
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"yourImageName.png" ofType:nil]];
答案 3 :(得分:0)
当您收到内存不足警告时,您是否有可能释放某个属性然后尝试使用它,但是您正在使用nil?
您是否尝试在模拟器中模拟低内存警告以查看它是否崩溃?硬件>模拟记忆警告