2012-02-16 1 views
1

나는 프로그램에서 크기 조정 및 서브 뷰 재배치를 수행하는 프로젝트에서 많은 수의 뷰를 보유하고 있습니다. 나는 다음과 같은 코드를 사용하여, layoutSubviews에서이 작업을 수행 :뷰를 재배치하기 위해 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. ... 

코드의이 유형은 항상 지금, 몇 년 나를 위해 좋은 일했다. 나는 최근에 이와 같은 코드를 동료의 프로젝트에 추가했으며, 지금은 매우 이상하게 행동하기 시작했습니다. 이유는 모르겠지만 여기에서 다시 사용 된 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; 

나는이 변경하면 모든 것이 제대로 작동으로 돌아 간다. 하지만 저는 왜 이런 일이 발생 하는지를 알고 싶어합니다. 특히 장치에서 발생하지만 왜 시뮬레이터에서는 발생하지 않는지를 알고 있습니다.. 또한 동료가보기에 변경을 가할 때까지는 발생하지 않는 것처럼 보이지만보기의 배치와 관련이없는 변경이이를 수행 할 수있는 방법은 분명하지 않습니다.

또 다른 변경 사항은 코드를 가져온 프로젝트가 ARC를 사용하는 반면 원래 코드는 ARC를 사용하지 않는 것입니다.

+2

'self.btnOne.frame;'행은 아무 효과가 없습니다 (컴파일러 경고를 제공해야합니다). 이게 진짜 코드인가요? –

+1

rect는 스택에 있기 때문에 스택의 다른 위치에 배열이 있으면 일부 코드가 배열 (또는 다른 구조체)의 끝 (또는 시작 전에)을 쓰고 있으면 rect의 일부를 덮어 쓸 수 있습니다. 변수에 감시 점을 놓고 변수가 어디에서 변경되었는지를 파악하여 변수의 원인을 정확히 파악할 수 있습니다. – user1118321

+0

동료의 프로젝트에있는 견해가 변화의 영향을 받는지 알려줄 수 있습니까? Apple docs는 transform 속성에 대한 경고 메시지를 표시합니다. "이 속성이 ID 변환이 아닌 경우 frame 속성의 값은 정의되지 않으므로 무시해야합니다." –

답변

1

실제로 아무 일도 일어나지 않으면 컴파일러 오류가 발생합니다. CGRects에 대한 마법은 없습니다. 그들은 단지 구조체입니다.

최적화 사용 여부에 관계없이 동일한 결과가 나타 납니까? 다른 컴파일러 (gcc-llvm vs clang, 여전히 gcc가 있다면 gcc)?

이 모든 것이 armv7 장치입니까? armv6 장치의 엄지 코드와 관련하여 알려진 문제가 있으며 과거에는 비활성화되지 않았습니다. Xcode 4.3에서, 애플은 모든 아치의 엄지 손가락을 끄고 싶어합니다.

코드가 표시된 것처럼 간단하면 이 아니어야합니다. 어셈블리를보기가 어렵습니다.

나는 항상 CGRect를 재사용합니다.

+0

코드는 CGRect의 속성을 계산하기위한 논리와 같이 복잡하지 않지만, 불행히도 어셈블리를 말하지 않습니다. – MusiGenesis

+0

내가 본 장치는 모든 armv7 장치입니다. arm6 장치에 대해서는 알지 못합니다. 원래의 코드는 모두 armv6 iPod로 작성되었으며 항상 거기에서 잘 일했다). 다른 프로세서 아키텍처로 설명 할 수있는이 문제는 시뮬레이터에서 전혀 발생하지 않습니다. – MusiGenesis

관련 문제