当我搜索如何在iOS中实现自动调整大小时,我在- (CGFloat)heightForImageCellAtIndexPath:(NSIndexPath *)indexPath
{}中遇到了许多示例(here here和here) p>
static CommentedItemCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
});
但我无法找到这个dispatch_once背后的原因。我认为它的目的是节省一些记忆,但为什么这种风格。为什么不定义属性和延迟加载它。
@property (nonatomic, strong) UITableViewCell sizingCell;
与
- (UITableViewCell)getSizingCell
{
if (_sizingCell) return _sizingCell;
_sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
return _sizingCell;
}
想知道它的编码风格,或者这个dispatch_once实现背后有一些好处。
答案 0 :(得分:4)
dispatch_once
的行为在名称中。它只执行一次。
dispatch_once()
优于其他方法的好处是它更快。它在语义上也更清晰,因为dispatch_once()
的整个想法是“只执行一次”,这正是我们正在做的事情。
这是一个低级别的GCD API,与其他方法相比,性能得到了提升。
答案 1 :(得分:2)
如果您有多个表/集合视图实例,它将只保存内存,因为它们都将重用相同的实例。虽然可能不经常使用,但效率更高。使用静态还可以将所有代码保存在一个位置。
你当然可以按照你提出的方式做到这一点,而且一次调度的好处并不大,但我会选择一次路由调度(尽管你可以在你的模型中使用一次调度来实现延迟加载)
答案 2 :(得分:0)
您使用了多少行代码?在多少个不同的地方?如果你想让它的线程安全,那么你有很多行代码,你没有这样做?
dispatch_once是众所周知的众所周知的模式。代码完全在它所属的位置。它的工作原理,众所周知。这不是一个风格问题,这是一个使用众所周知的优越模式而不是随意,不安全和难以维护的方法的问题。