MKOverlayViewを使用してMKMapViewに大きなPNG画像(1936×2967)を配置するiPhoneアプリを書いています。MKOverlayView で drawMapRect: 関数を適切に実装する方法について少し混乱しています。画像を描画する前に手動でセグメント化する必要がありますか? または、MKOverlayView のメカニズムにすべてを処理させる必要がありますか?
他の投稿からの私の印象は、MKOverlayView が利用可能になる前は、この種のタスクのために自分で画像をセグメント化し、CATiledLayer を使用することが期待されていたということです。おそらく、MKOverlayView が面倒な作業をすべて処理してくれるのではないかと思いました。
私が尋ねた本当の理由は、割り当てツールを使用して Instruments を介してアプリを実行すると、アプリが使用するライブ バイト数が、マップ上にカスタム イメージを導入することで着実に増加することがわかったからです。現在、画像をセグメント化していませんが、Instruments のリーク ツールでメモリ リークの記録も見られません。これが私の drawMapRect: 関数です:
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{
// Load image from applicaiton bundle
NSString* imageFileName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"map.png"];
CGDataProviderRef provider = CGDataProviderCreateWithFilename([imageFileName UTF8String]);
CGImageRef image = CGImageCreateWithPNGDataProvider(provider, NULL, true, kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
MKMapRect overlayMapRect = [self.overlay boundingMapRect];
CGRect overlayRect = [self rectForMapRect:overlayMapRect];
// draw image
CGContextSaveGState(context);
CGContextDrawImage(context, overlayRect, image);
CGContextRestoreGState(context);
CGImageRelease(image);
}
私の drawMapRect: 関数がこれらのメモリの問題の原因ではない場合、誰かがそれが何であるかを知っていますか? デバッグを通じて、mapView の viewForOverlay: 関数はオーバーレイごとに 1 回しか呼び出されないことがわかっているため、そこでメモリがリークしているわけではありません。
どんなアドバイスでも大歓迎です!
ありがとう -マット
編集:メモリの問題は実際にはMKMapViewによって引き起こされていることがわかりました-マップを移動するたびに、メモリ使用量は非常に着実に増加し、決して低下しません-これは良くないようです:(