私はプロパティcgpathを含むダミーオブジェクトの配列を持っています。これは私のUIViewでdarkPathArrayプロパティと呼ばれます。より高速のデバイスでdrawRectの動作が変わってしまう
私はそれらを次々に描くときに、私は興味深いことが起こることを発見しました。 iOS 5 sim/deviceで実行している場合、EXC_BAD_ACCESSはCGContextAddPath(context,ppath.path);
(ppath.path
)です。しかしNSLog
コールをCGContextAddPath
の前に置くと正しく動作します。そして、これはかなり遅くなっているからです。
したがって、この問題は、-drawRect
の呼び出しの頻度にあります。それは大丈夫です、私はそれを作るまでそれを偽造することができましたが、それはプロの仕方ではありません。
私はなぜこれが起こっているのか尋ねていますか?
-(void)drawRect:(CGRect)r
{
// Get the graphics context and clear it
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, self.bounds);
[[UIColor whiteColor] set];
UIRectFill ([self bounds]);
// Draw every single section as a path
for (ShopSection *section in self.shopSectionsArray) {
// Draw the walls
[section.darkColor setFill];
for (MMPath *ppath in section.darkPathArray) {
CGContextAddPath(context,ppath.path);
CGContextDrawPath(context, kCGPathFill);
}
}
}
編集: ARCは
MMPathsはなぜ(これらは配列に安全に保存されている)
スーパー
EXC_BAD_ACCESSが悪いセクションオブジェクトに応答している/知らない変更されていない使用可能にUIScrollView レイヤー:CATiledLayer
不正アクセスの問題は、c速いデバイス/シミュレーター上で、または激しくスクロールしたりズームしたりすると、迅速に再描画されます。
編集2: 私はそれを得たと思う!問題は、CATiledLayerがバックラウンドスレッドを描画するため、何とかそれが尾を引っ掛けてしまうことです。どのように修正するか考えてみましょうか?そのための最善のアプローチは何ですか?私は間違って何をしていますか?
は、ARCが有効かいませんか? –
このコード中にself.shopSectionsArrayまたはsection.darkPathArrayまたは 'MMPaths'のいずれかが変更されていますか?多分別のスレッドで? –
はい、ARCが有効です。いいえ、MMPathsは他のコードでは変更されません。 – KutakMir