2011-10-18 1 views
3

ARC 하에서 모든 IBOutlet을 속성으로 만드는 것은 무엇입니까? 뷰 컨트롤러가 내부적으로 만 사용하는 IBOutlets에 ivars를 사용하면 어떤 단점이 있습니까?ARC에서 IBOutlets의 속성을 사용하면 유용합니까?

+0

왜 속성을 만들어야한다고 생각합니까? – Phlibbo

+0

@Phlibbo : 저는 여기 저기에 "좋은 습관"이 있으며 viewDidUnload 코드를 간소화하고 있습니다. –

+0

Scott Meyers와 Herb Sutter가 C++ 용으로 작성한 책과 비슷한 "Effective iOS"책이 있었으면 좋겠습니다. –

답변

8

setter/getter 메소드를 사용하지 않는 경우 해당 속성에 대한 키 - 값 관측에 의존하지 말고 하위 클래스가 해당 속성을 재정의하여 이익을 얻을 것이라고 예상하지 말고 실제 ARC에서 IBOutlets에 ivars를 사용하는 단점.

+0

감사합니다. ivars는 내 코드에서 많은'self.' 접두어를 제거합니다. –

+0

내 대답을 확인하고 무슨 일이 일어나고 있는지 통찰력이 있는지 알려주십시오. –

0

"개인"IBOutlets에 ivars를 사용하여 메모리 누수 문제가 발생했습니다. 내 IBOutlets가 __weak 대신 __unsafe_unretained 속성을 사용했기 때문이라고 생각합니다. __weak은 iOS 4에서 지원되지 않기 때문에 사용할 수 없습니다 (내 앱이 iOS 4와 역 호환되기를 바랍니다). ARC, IBOutlets, viewDidUnload 및 그 모든 혼란으로 인해 실제로 일어나고있는 것을 파악하는 것은 어렵습니다. 한숨 ...

어쨌든 IBAutlets를 ivars에서 속성으로 변경하면 메모리 누수 문제가 사라졌습니다.

내 질문에 답하기 위해 IBAutlets에 ivars를 사용하는 한 가지 단점은 __unsafe_unretained 속성이있는 경우 메모리 누수가 발생할 수 있다는 것입니다.

+0

이것이 누수의 근원은 아닐 것입니다. 당신의 매장이 '__unsafe_ unretained'되었다면, 정의에 따라 그 아이발들은 목표를 유지하지 못했고, * 유지하지 않으면 누출을 일으킬 수 없습니다. (충돌을 일으킬 수는 있지만 또 다른 이야기입니다.) 추가 한 속성이 unsafe_unretained인지 여부는 지정하지 않았지만 속성을 추가하여 수행 할 수 있었던 유일한 방법은 * more * retain입니다. 더 자세한 내용이 없으면 왜 누출되었다고 말할 수 없습니다. 정말로 호기심이 있으면 다른 질문을 제출할 수 있습니다. –

+0

내가 추가 한 속성은 실제로'unsafe_unretained'였습니다. IBOutlets를 ivars에서 속성으로 바꾸는 것이 왜 효과가 있는지 궁금합니다. 어쩌면 Xcode의 악기를 올바르게 해석하지 못하는 것일 수 있습니다. –

+0

unsafe_unretained로 인해 충돌이 발생할 수 있지만 누출이 발생하지는 않습니다. 나는 당신이 악기를 잘못 해석하고 있다고 말하고 싶습니다. 죄송합니다. :) 그러나 그것은 말하기를 몇 달이 지났습니다. 무슨 일이 일어나고 있는지에 대해 더 많은 통찰력을 갖고 있습니까? –