假设我的视图控制器中有一个属性,定义如下:
@property (nonatomic, retain) UIImageView *checkmarkOffAccessoryView;
I @synthesize
这在实施中,release
it in -dealloc
并初始化它-viewDidLoad
如下:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
到目前为止,一切都很好。
当我在表视图委托中使用它作为多个单元格的附件视图时,会发生两件事:
- 仅一个单元格的附件视图显示图像
- 应用程序 UI 冻结。
据我所知,应用程序并没有崩溃,用户界面只是变得没有响应。这既在模拟器中又在设备上。
以下是我如何在单元格中使用初始化属性:
- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// initialize or dequeue cell...
if (condition)
cell.accessoryView = self.checkmarkOffAccessoryView;
else
cell.accessoryView = nil;
}
使用上述代码,只有一个单元格显示附件视图,并且 UI 冻结。
如果我初始化UIImageView
直接在委托方法中实例化,我得到了显示附件视图的所有满足条件的单元格,并且我没有遇到 UI 冻结:
- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// initialize or dequeue cell...
if (condition)
cell.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
else
cell.accessoryView = nil;
}
我的目标是初始化尽可能少的对象并重用一个UIImageView
。我很好奇为什么第一块代码有问题以及我可以采取什么措施来解决这个问题。
好像是细胞的accessoryView
属性应该只增加retain
计数self.checkmarkOffAccessoryView
但看来我遗漏了一些细节。
我忽略了什么?谢谢你的建议。
EDIT
我觉得:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
是相同的:
UIImageView *uncheckedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]];
self.checkmarkOffAccessoryView = uncheckedView;
[uncheckedView release];
不管怎样,我都会经历同样的冻结症状。