私のカスタムサブビューが完全に最適化されたスクリーン上の間違った場所に表示されるが、最適化がオフになっても完璧に機能するという奇妙なエラーが発生します。最適化なしiPhoneのコンパイラの最適化とUIViewフレーム
CGPoint newPoint = [self locationOfItem:i];
NSLog(@"setting new point to %@", NSStringFromCGPoint(newPoint));
CGRect newFrame = CGRectMake(newPoint.x, newPoint.y, view.frame.size.width, view.frame.size.height);
view.frame = newFrame;
NSLog(@"cell frame is %@ %@", NSStringFromCGRect(view.frame), NSStringFromCGRect(newFrame));
が、これは完璧に動作します:
はここに関連するスニペットです。 -O0
以外の任意の最適化フラグの下で(私は-Os
を使用していますが、問題は0(ゼロ)以外の最適化レベルで発生した)、私が取得:
2012-01-24 18:37:11.881 MyApp[36498:707] setting new point to {8, 92}
2012-01-24 18:37:11.884 MyApp[36498:707] cell frame is {{8, 8}, {68, 80}} {{8, 8}, {68, 80}}
、率直に言って、恐ろしい応答です。
newPoint
のy座標は92ですが、矩形に設定してからUIView#setFrame
に渡すと8になり、表示ロジックが完全に壊れます。
ここでは何が起こっていますか?どのように最適化がこれを起こすことができますか?
私はLLVM 3.0、Xcode 4.2.1を使用してarmv6にコンパイルしています。
更新:
以下のコードは正常に動作するようです:
CGRect frame;
frame.origin = newPoint;
frame.size = view.frame.size;
view.frame = frame;
NSLog(@"setting cell frame3 to %@ %@", NSStringFromCGRect(view.frame), NSStringFromCGRect(frame));
私のプロジェクトでLLVM + armv6 + CGFloatsと同様の問題がありました。私は他の問題のためにarmv7を出荷することになった。しかし、それ以前は、私の回避策はarmv6部分の-O0を残していました。 – iccir
フォローアップの質問が大変申し訳ありませんが、armv7に同梱されている場合は、アップデートはiPhone 3Gユーザには表示されませんか? App Storeにアップロードする際にサポートしているデバイスを指定する必要がありますか?私はいつもarmv7と一緒に出荷すれば私の古いユーザーは "レンガ造りの"アップデートをダウンロードすることになるのではないかと恐れていました。また、太いバイナリ(armv6/armv7)を実行し、armv6だけに "-O0"を指定することは可能ですか? – Bill
質問嵐は良いです:)私の理解から、以前のバイナリと同じバージョンのiOSをターゲットとするバイナリをアップロードすることはできませんが、ハードウェアサポートは削除されます。必要なiOSの最小バージョンを増やすことができます。 iOS 4.3が必要な場合は、armv7デバイスのみがサポートされているため、armv7デバイスのみをサポートする必要があります。私は初めからarmv7のみを出荷していたので、これで実世界の経験はありませんでした。あなたの-O0の質問に対して私の古い設定を掘り下げようとしましょう。 – iccir