我有一个具有相同 UIView 的许多实例的应用程序。他们是一种像 UITableViewCell 一样重用 UIView 的方法吗?如同:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
我有一个具有相同 UIView 的许多实例的应用程序。他们是一种像 UITableViewCell 一样重用 UIView 的方法吗?如同:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
我建议您观看WWDC 的2010 年第104场会议,名为“使用 ScrollViews 设计应用程序”,它解释了重用机制 (IIRC)。
您还可以查看OHGridView
我实现此技术的源代码:查看OHGridView.mlayoutSubviews
中的第二个方法,我在其中添加了未使用的I called ,然后在需要时从中取出一些。UIViews
NSMutableSet
recyclePool
UIViews
recyclePool
我建议使用 NSCache 来缓存您需要缓存的 UIView 实例。NSCache 与 NSDictionary 不同,因为它不复制键来获取值,并且它允许一些很好的机制来处理内存。检查文档,看看它是否适合您。我最近使用它来缓存 UIPinAnnotationView 对象。
这个简单的代码演示了基本池,如果它不在任何层次结构中,则使视图出队。对于复杂的用例,您应该需要标识符、锁...
看看我的要点FTGViewPool
@interface FTGViewPool ()
@property (nonatomic, strong) NSMutableArray *views;
@property (nonatomic, assign) Class viewClass;
@end
@implementation FTGViewPool
- (instancetype)initWithViewClass:(Class)kClass {
self = [super init];
if (self) {
_views = [NSMutableArray array];
_viewClass = kClass;
}
return self;
}
- (UIView *)dequeueView {
// Find the first view that is not in any hierarchy
for (UIView *view in self.views) {
if (!view.superview) {
return view;
}
}
// Else create new view
UIView *view = [[self.viewClass alloc] init];
[self.views addObject:view];
return view;
}