CALayer の複数のインスタンス (すべて同じフレーム、コンテンツなど) でいっぱいの NSArray を作成するにはどうすればよいですか?
背景: CALayer は作成に多少のオーバーヘッドがかかるため、クラスの init メソッドで多数の CALayer (すべて同じプロパティを共有) を作成したいと考えています (後でそのクラスで使用します)。
CALayer の複数のインスタンス (すべて同じフレーム、コンテンツなど) でいっぱいの NSArray を作成するにはどうすればよいですか?
背景: CALayer は作成に多少のオーバーヘッドがかかるため、クラスの init メソッドで多数の CALayer (すべて同じプロパティを共有) を作成したいと考えています (後でそのクラスで使用します)。
特にこれを試したことはありませんが、以下CALayer
を利用してディープコピーを実行できることはわかっていますNSCoding
。
CALayer *layer = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:layer]];
ただし、それらをコピーすることが実際にパフォーマンスにどのように役立つかはわかりません。
-(id)copy
CALayer にはメソッドが組み込まれていません。理由はわかりません。ただし、自分でジンアップするのは難しくありません。CALayer カテゴリを作成し、独自のコピー メソッドを記述します。あなたがしなければならないのは、インスタンス化して手動でパブリック ivar/プロパティをオリジナルから取得し、新しいコピーに設定することだけです。電話することを忘れないでください[super copy]
ところで、CALayer はオブジェクトです。NSArray に追加できます。
CAReplicatorLayer を使用してみてください。レイヤーを複製できます。
参照: https://developer.apple.com/documentation/quartzcore/careplicatorlayer
サンプルコード: http://www.knowstack.com/swift-careplicatorlayer-sample-code/ https://developer.apple.com/documentation/quartzcore/careplicatorlayer/1522391-instancedelay
私は自分のプログラムでまったく同じことをします。
init:
self.turrets = [NSMutableArray array];
for (count = 0; count < kMaxTurrets; count++)
[self spawnTurret];
spawnTurret:
evTurret* aTurret = [[[evTurret alloc] init] autorelease];
CGImageRef theImage = [self turretContents];
aTurret.contents = theImage;
double imageHeight = CGImageGetHeight(theImage);
double imageWidth = CGImageGetWidth(theImage);
double turretSize = 0.06*(mapLayer.bounds.size.width + mapLayer.bounds.size.height)/2.0;
aTurret.bounds = CGRectMake(-turretSize*0.5, turretSize*0.5, turretSize*(imageWidth/imageHeight), turretSize);
aTurret.hidden = YES;
[mapLayer addSublayer:aTurret];
[self.turrets addObject:aTurret];
基本的には、CALayerオブジェクトを繰り返し作成するだけです。プロパティを読み取ってから追加で設定する必要があるコピーとは対照的に、このメソッドはプロパティごとに1つのCALayer呼び出しのみを必要とするため、コピーするよりも高速になります。このメソッドを使用して約0.02秒で約500個のオブジェクトを生成するので、間違いなく高速です。もっと高速にする必要がある場合は、画像ファイルをキャッシュすることもできます。
そのため、NSProxy が使用されます。あなたが説明しているのは一般的なシナリオであり、そこから任意の数の設計パターンが派生します。
Pro Objective-C Design Patterns for iOS は、あなたが説明したまさにその問題に対する解決策を提供します。第 3 章: プロトタイプ パターンを読んでください。要約定義は次のとおりです。
Prototype パターンは、プロトタイプ インスタンスを使用して作成するオブジェクトの種類を指定します。これにより、このインスタンスをコピーすることによって新しいオブジェクトが作成されます。