objective-c中的对象分配/释放不正确

时间:2012-02-27 10:13:59

标签: objective-c memory-management uitableview

我运行了一个带分配和内存泄漏选项的分析器。 我发现与表格单元格相关的对象永远不会被释放。 通过进一步分析,我发现问题是由我存储在单元格中的自定义图像引起的。 我解释得更好:

我有一个扩展表格单元格的对象:

@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"];

一切都表现良好,并且探查器没有显示任何错误,特别是对象,特别是单元格被正确解除分配。

此时我有两个简单的问题。

  • 为什么这不显示为泄漏?我的意思是,使用泄漏选项进行分析并不会将其显示为泄漏
  • 我的自定义图片出了什么问题?

感谢

1 个答案:

答案 0 :(得分:1)

你有一个imageCache:这表明你实际上是在尝试缓存图像。根据定义,这将导致它们在您不使用它们时挂起。您需要考虑缓存策略:您真的需要缓存图像吗?如果是这样,需要多久?什么时候可以从缓存中清空图像?

您可以考虑为缓存使用可清除内存(与NSCache集成),以便操作系统可以管理丢失图像时丢失的图像。