同じUIViewのインスタンスが多数あるアプリがあります。UITableViewCellでできるようにUIViewを再利用する方法はありますか?に似ている:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
同じUIViewのインスタンスが多数あるアプリがあります。UITableViewCellでできるようにUIViewを再利用する方法はありますか?に似ている:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
再利用メカニズム(IIRC)について説明している「ScrollViewsを使用したアプリの設計」と呼ばれるWWDCの2010年のセッション104をご覧になることをお勧めします。
OHGridView
また、この手法を実装したソースを確認することもできます。OHGridView.mlayoutSubviews
の2番目のメソッドを確認します。ここでは、と呼ばれるIで未使用を追加し、必要に応じてこれからいくつかをデキューします。UIViews
NSMutableSet
recyclePool
UIViews
recyclePool
NSCacheを使用して、キャッシュする必要のあるUIViewインスタンスをキャッシュすることをお勧めします。NSCacheは、値を取得するためにキーをコピーせず、メモリを処理するための優れたメカニズムを可能にするという点でNSDictionaryとは異なります。ドキュメントをチェックして、それがあなたのために働くかどうか確かめてください。最近、これを使用してUIPinAnnotationViewオブジェクトをキャッシュしました。
この単純なコードは、ビューが階層にない場合にビューをデキューする基本的なプールを示しています。複雑なユースケースの場合、識別子、ロック、...が必要です。
@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;
}