Ios IMAGECELLATINDEXPATH在高度上调度_一次的原因

Ios IMAGECELLATINDEXPATH在高度上调度_一次的原因,ios,objective-c,uitableview,autolayout,autosize,Ios,Objective C,Uitableview,Autolayout,Autosize,当我搜索如何在iOS中实现自动调整单元格大小时,我在-(CGFloat)heightForImageCellAtIndexPath:(NSIndexPath*)indexPath中遇到了许多例子(和)这些神秘的代码 static CommentedItemCell *sizingCell = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sizingCell = [self.tableVie

当我搜索如何在iOS中实现自动调整单元格大小时,我在
-(CGFloat)heightForImageCellAtIndexPath:(NSIndexPath*)indexPath中遇到了许多例子(和)这些神秘的代码

static CommentedItemCell *sizingCell = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
});
但我找不到这件事背后的原因。我认为它的目的是保存一些记忆,但为什么是这种风格。为什么不定义属性并延迟加载它呢

@property(非原子,强)UITableViewCell sizingCell


想知道它只是一种编码风格,或者说这种dispatch_once实现背后有一些好处。

只有当您的表/集合视图有多个实例时,它才会节省内存,因为它们都会重用同一个实例。这是更有效的,虽然可能不经常使用。使用static还可以将所有代码保存在一个地方


你当然可以按照你建议的方式来做,一次分派的好处并不多,但我会选择一次分派路线(尽管你可以在模型中使用一次分派来实现延迟负载)。

一次分派的行为是名副其实的。它只做一次

与其他方法相比,
dispatch\u once()
的优点是速度更快。它在语义上也更清晰,因为
dispatch\u once()
的整个思想是“只执行一次”,这正是我们正在做的


这是一个低级的GCD API,与其他方法相比,它提供了性能改进。

您使用了多少行代码?在多少不同的地方?如果你想让它线程安全,你需要很多行代码,但你没有


dispatch_once是众所周知的模式,每个人都能理解。代码就在它所属的地方。它是有效的,而且众所周知它是有效的。这不是一个风格的问题,这是一个使用众所周知的、优越的模式而不是随意、不安全、难以维护的方法的问题

此外,我们生活在一个多线程的世界中,dispatch_once是线程安全的。可以保证,来自多个线程的多个同时调用dispatch_once只会执行一次块,所有线程都会等到执行完成后,dispatch_once才会返回。即使你自己也不难做到,但dispatch_once也非常快,而且很难做到。我同意这种分派模式,将代码保留在它所属的位置。但仍然怀疑惰性负载属性是多么随意、不安全和难以维护?
- (UITableViewCell)getSizingCell
{
  if (_sizingCell) return _sizingCell;

  _sizingCell = [self.tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

  return _sizingCell;
}