【发布时间】: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