【问题标题】:Incorrect object allocation/deallocation in objective-cObjective-c 中不正确的对象分配/释放
【发布时间】:2012-02-27 10:13:59
【问题描述】:

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

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

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

一切正常,分析器没有显示任何错误,对象,特别是单元格,被正确释放。

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

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

谢谢

【问题讨论】:

  • 没有ExtendedImage的代码就无法回答。
  • ExtendedImage 只有这个 initMethod 和一个用于选项的 @property(strong),其余的只是扩展 UIImage。希望这对你来说已经足够了。

标签: objective-c memory-management uitableview


【解决方案1】:

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

您可以考虑使用可清除内存(与 NSCache 集成)作为缓存,以便操作系统可以在图像妨碍时将其丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2011-12-13
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多