2012-01-24 20 views
2

私のカスタムサブビューが完全に最適化されたスクリーン上の間違った場所に表示されるが、最適化がオフになっても完璧に機能するという奇妙なエラーが発生します。最適化なし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)); 
+1

私のプロジェクトでLLVM + armv6 + CGFloatsと同様の問題がありました。私は他の問題のためにarmv7を出荷することになった。しかし、それ以前は、私の回避策はarmv6部分の-O0を残していました。 – iccir

+0

フォローアップの質問が大変申し訳ありませんが、armv7に同梱されている場合は、アップデートはiPhone 3Gユーザには表示されませんか? App Storeにアップロードする際にサポートしているデバイスを指定する必要がありますか?私はいつもarmv7と一緒に出荷すれば私の古いユーザーは "レンガ造りの"アップデートをダウンロードすることになるのではないかと恐れていました。また、太いバイナリ(armv6/armv7)を実行し、armv6だけに "-O0"を指定することは可能ですか? – Bill

+0

質問嵐は良いです:)私の理解から、以前のバイナリと同じバージョンのiOSをターゲットとするバイナリをアップロードすることはできませんが、ハードウェアサポートは削除されます。必要なiOSの最小バージョンを増やすことができます。 iOS 4.3が必要な場合は、armv7デバイスのみがサポートされているため、armv7デバイスのみをサポートする必要があります。私は初めからarmv7のみを出荷していたので、これで実世界の経験はありませんでした。あなたの-O0の質問に対して私の古い設定を掘り下げようとしましょう。 – iccir

答えて

3

あなたのコンパイラフラグに-mno-thumbを追加します。これは、Thumbモードでarmv6をターゲットとするXcode 4.2の既知の問題です。

+0

ありがとうございます。私は数ヶ月前にこれについて聞いていましたが、Thumbがデフォルトでオフになっていると思っていましたが、これをオフにすることを積極的に選択した場合、これは問題でした。親指を無効にすることは私の奇妙さを修正しました。本当に、本当に感謝! – Bill

関連する問題