2012-02-16 7 views
1

私はプロジェクトで、サブビューのプログラムによるサイズ変更と再配置を行うビューが非常に多いです。コードのこのタイプは、常に今、年間のカップルのための私のためにうまく働いていなぜビューを再配置するためにCGRectを再使用するのが悪いですか?

CGRect rect = self.btnOne.frame; 
// change values for rect 
self.btnOne.frame = rect; 

// re-use same CGRect to reposition other views 
rect = self.btnTwo.frame; 
// change values 
self.btnTwo.frame = rect; 

// etc. ... 

:私はこのようなコードを使用して、layoutSubviewsでこれを行います。私は最近、このようなコードを共同作業者のプロジェクトに追加しました。それは今、非常に奇妙な動作を始めています。理由が分からないので、ここで再利用されるrectオブジェクトは、ビューのフレームが割り当てられてからブロックの最後のビューのフレームに再割り当てされるまでの間に、ランダムに独自の値を変更することがあります。その結果、不適切な位置にあるサブビューが発生します。このエラーは通常rect.origin.yの値を取得しているか、その逆の形をとってrect.origin.xの形をとっているようです。

この問題は実際のデバイスでのみ発生します。シミュレータ上で実行されている全く同じコードに問題はありません。

修正がそうのように、各サブビューのために独自に宣言CGRectオブジェクトを使用することです:

CGRect rect = self.btnOne.frame; 
// change values for rect 
self.btnOne.frame = rect; 

// declare new CGRect to reposition other views 
CGRect rect2 = self.btnTwo.frame; 
// change values 
self.btnTwo.frame = rect2; 

私はこの変更を行うと、すべてが正しく動作に戻ります。しかし、私は本当になぜこれが起こるか知っていることに興味があり、特にそれがデバイス上で起こる理由を知っていますが、シミュレータではありません。また、同僚がビューを変更するまでは起こらないようですが、ビューの位置付けに関係なくどのような変更がこれを行うことができるかはわかりません。

もう1つの変更点は、コードをインポートしたプロジェクトがARCを使用しているのに対して、元のコードはARCを使用していないことです。

+2

'self.btnOne.frame;'行は効果がありません(また、コンパイラの警告が必要です)。これはあなたの本当のコードですか? –

+1

rectはスタック上にあるので、スタック上の他の場所に配列があると、配列の一部(または他の構造体)の終わり(または先頭より前)にコードが書き込まれていると、rectの一部を上書きする可能性があります。変数にウォッチポイントを置いて変数がどこで変更されているのかを確認して、変化の原因を正確に把握することができます。 – user1118321

+0

あなたの同僚のプロジェクトのビューが変換の影響を受けるかどうかを教えてください。 Apple docsは変換プロパティについて警告しています。「このプロパティがID変換でない場合、frameプロパティの値は定義されていないため、無視する必要があります。 –

答えて

1

実際に何も進んでいない場合は、コンパイラエラーのように聞こえます。 CGRectについては何も魔法はありません。それらは単なる構造体です。

最適化の有無にかかわらず同じ結果が得られますか?別のコンパイラ(gcc-llvm vs clang、gccをまだ持っている場合)?

これはすべてarmv7デバイスでですか? armv6デバイスのサムコードには既知の問題があり、以前は無効になっていませんでした。 Xcode 4.3以降、Appleはすべてのアーチの親指をオフにしたいと思われるようです。

コードを表示するだけで簡単な場合は、であり、アセンブリを参照するのは難しいです。

私はいつもCGRectを再利用しています。

+0

コードはそれほど複雑ではありません(CGRectのプロパティを計算するためのロジック)。しかし、残念なことにアセンブリは話さない。 – MusiGenesis

+0

これまでに見たデバイスはすべてarmv7デバイスです(arm6デバイスについては、現時点ではデプロイするように構成されていないため知らない - 元のコードはすべてarmv6 iPodで書かれています。そこでうまくいった)。この問題は、シミュレータ上ではまったく発生しません。これは、異なるプロセッサアーキテクチャによって説明される可能性があります。 – MusiGenesis

関連する問題