【发布时间】:2011-03-12 13:34:10
【问题描述】:
假设我的视图控制器中有一个属性,定义如下:
@property (nonatomic, retain) UIImageView *checkmarkOffAccessoryView;
我在实现中@synthesize这个,release它在-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 属性应该只是增加self.checkmarkOffAccessoryView 的retain 计数,但似乎我缺少一些细节。
我忽略了什么?谢谢你的建议。
编辑
我认为:
self.checkmarkOffAccessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]] autorelease];
等同于:
UIImageView *uncheckedView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"checkmarkOff.png"]];
self.checkmarkOffAccessoryView = uncheckedView;
[uncheckedView release];
无论哪种方式,我都会遇到相同的冻结症状。
【问题讨论】:
-
如果您不使用点符号来访问该属性会发生什么?即 cell.accessoryView = checkmarkOffAccessoryView_;
-
Alex:我不确定我的回复有什么不足,这触发了您的赏金,但您可能想评论并澄清为什么答案不足,以便回复者可以说“哦,好吧”或调整他们的答案以更好地适应您的问题。
标签: iphone uitableview uiimageview