我运行了一个带分配和内存泄漏选项的分析器。 我发现与表格单元格相关的对象永远不会被释放。 通过进一步分析,我发现问题是由我存储在单元格中的自定义图像引起的。 我解释得更好:
我有一个扩展表格单元格的对象:
@interface IP2TableViewCell : UITableViewCell
@property(nonatomic,weak) IBOutlet UIImageView *background;
@property(nonatomic,weak) IBOutlet UIImageView *thumbnail;
@property(nonatomic,weak) IBOutlet UILabel *cellTitle;
@property(nonatomic,weak) IBOutlet UILabel *cellDescr;
@end
在.m类文件中只有简单的@synthesize而没有别的。
然后我创建了一个扩展UIImage的类,它具有我正在使用的相关initMethod。 我不得不说self = [super ..]是代码片段我完全不明白我借用了自动生成的视图控制器代码,这是if(self = [super initWith ...)
-(ExtendedImage*)initWithPath:(NSString*)path andOptions:(NSDictionary*)opt {
self=[super initWithContensOfFile:path];
self.options=opt;
return self;
}
这是分配问题开始显示的地方。 我有一个工厂,通过调用上面的init方法来构建图像,然后将图像添加到单元格中。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *obj = [fetchedResultsController objectAtIndexPath:indexPath];
IP2TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableCell"];
cell.cellTitle.text=[obj objectForKey:@"cellTitle"];
NSDictionary *options = [NSDictionary dictionaryWithObject:indexPath forKey:@"indexPath"];
ExtendedImage *ei = [imageCache imageWithPath:@"/path/to/file" withOptions:options];
cell.thumbnail.image=ei;
return cell;
}
在分析器中,显示ExtendedImage永远存在,并且永远不会被释放,并且表单单元也不会被释放。 如果在其他情况下我做
cell.thumbnail.image=[UIImage imageWithContentsOfFile:@"/path/to/file"];
一切都表现良好,并且探查器没有显示任何错误,特别是对象,特别是单元格被正确解除分配。
此时我有两个简单的问题。
感谢
答案 0 :(得分:1)
你有一个imageCache
:这表明你实际上是在尝试缓存图像。根据定义,这将导致它们在您不使用它们时挂起。您需要考虑缓存策略:您真的需要缓存图像吗?如果是这样,需要多久?什么时候可以从缓存中清空图像?
您可以考虑为缓存使用可清除内存(与NSCache集成),以便操作系统可以管理丢失图像时丢失的图像。