2012-05-08 2 views
7

Memory Management에 대한 일부 읽기를하고 있으며 초기화 메서드에서 접근 자 메서드를 사용하지 않는 것이 좋습니다.초기화 메서드 및 접근 자 메서드에서 접근 자 메서드 사용 안 함

질문 : 우리는 나뿐만 아니라 유래 및 다른 사이트에이 문제에 대한 참조 쿠페를 검색 한

initilizer 방법에 접근 방법을 사용하지 말아야하는 이유. 그러나 나는 아직도 그것에 대해 혼란스럽지 않습니다.

아무도 나에게이 문제에 대해 조언을하거나, 나 자신에게 그것을 통해 갈 수 있도록 예제 나 좋은 참조를 던질 수 있다면. 감사합니다.

+0

이미이 주제에 대해 읽은 자료는 무엇입니까? 어느 것이 당신을 혼란스럽게합니까? – Jim

+0

내가 삽입 한 링크를 살펴 보셨습니까? 사실, 내 질문은 스레드의 주제이기도합니다. 나는 지금 당신이 내 questin을 볼 수 있도록 편집을했다. – tranvutuan

답변

2

여기에 내가 쓴 예는 두 가지 방법을 보여줍니다입니다 :

  • 초기화를 다시 정렬 할 수있는 방법을
  • 의 예는 초기화에 초점을 맞추고 있지만 누수는

Initializing a property, dot notation

도입 할 수있는 방법 , dealloc은 유사한 범주의 문제에 취약합니다. 하나의 구체적인 예로 : 개체가 부분적으로 부활 할 수 있습니다 (dealloc). 참조 횟수 불균형이 잠재적 위험이됩니다.

간단히 말해, 모든 하위 클래스를 통한 객체의 동작에 대한 영향/영향보다는 객체가 필요로하는 데이터의 초기화 및 정리에 중점을두고 싶습니다.


더 읽기 :

Why myInstance = nil instead of self.myInstance = nil?

Should I refer to self.property in the init method with ARC?

Best way to set a retained property to a newly created object

1

양측의 개발자들과 종교적인 문제가 조금 있습니다. ARC가 도착하자마자 문제가 더 복잡해졌습니다.

몇 가지 이유는 다음과 같습니다

  1. 개체가 완전히 초기화되지 않고 접근이 완전히 초기화 객체에 따라 달라질 수 있습니다.

  2. 접근자는 부작용이있을 수 있으며 개체가 완전히 초기화되지 않은 것일 수 있습니다. 한 가지 일반적인 부작용은 처음 사용할 때 iVar를 인스턴스화하는 것입니다.

이러한 인수는 (비 ARC 코드) dealloc에서 사용하는 접근에 적용 할 수 있습니다.

1

KVC 관계자는 getter와 setter 메소드를 모니터링 할 수 있습니다. 아무도 당신의 재산을 관찰하지 않는다는 것을 절대 확신하지 않는 한, 당신은 문제를 요구하고 있습니다. 관찰자가 부분적으로 dealloc 된 객체를 가지고 주변을 비웃는 결함은 재현하기가 매우 어렵고 테스트하기가 거의 불가능합니다.

0

intiailiser 메서드 및 dealloc에서 접근 자 메서드를 사용하지 않은 주된 이유는 Mac OS X 개발에서 유래 한 것일 뿐이므로 아마도 iOS에서는별로 문제가되지 않습니다. Mac OS X GUI 개발에는 컨트롤의 속성을 객체의 속성에 바인딩 할 수있는 "바인딩"이라는 유용한 기능이 포함되어있어 사용자가 컨트롤을 업데이트하면 "바인딩"이 자동으로 속성을 업데이트합니다. 프로그램이 접근 자 메서드를 통해 속성을 업데이트하면 "바인딩"이 자동으로 컨트롤을 업데이트합니다.

많은 바인딩 작업이 Key-Value Observing (나는 생각합니다)으로 수행됩니다. 키 - 값 관측 (Key-Value Observing)은 객체가 다른 객체의 속성에 대한 변경을 관찰하는 경우입니다. 접근 자 메서드를 사용하여 속성을 변경할 때마다 객체를 관찰하는 모든 객체에 알림이 보내 지므로 속성의 새 값에 대해 작업을 수행 할 수 있습니다. 액세서 메소드를 사용하면 초기화 및 할당 해제와 같이 키 - 값 관찰 통지가 발생하지 않도록 할 때 트리거 할 수 있습니다. 객체 관찰자는 부분적으로 초기화되거나 부분적으로 할당이 취소 된 인스턴스 만 처리하기 때문에 완전하게 초기화 된 인스턴스.

또 다른 주요 관심 영역이 있는데, 이는 객체가 서브 클래 싱되는 경우입니다. 접근 자 메서드를 사용하여 객체의 속성을 설정할 때 실제로는 다른 접근 자 메서드를 구현하는 경우 하위 클래스의 접근 자 메서드를 호출합니다. Objective-C 개발의 상속은 .NET과 비교할 때 거의 없기 때문에 문제가 될 가능성이 적습니다.

+0

intiailiser 메서드 및 dealloc에서 접근 자 메서드를 사용하지 않은 주된 이유는 Mac OS X 개발에서 유래 한 것일 뿐이므로 아마도 iOS에서는별로 문제가되지 않을 것입니다. 바인딩은 잠재적 인 부작용 목록에 추가됩니다. 관찰, UI 요소 등을 사용하지 않고 부작용 (읽기 : 버그)이 발생할 수 있습니다. 여기에 파운데이션 유형을 사용하는 필자가 작성한 데모가 있습니다. http://stackoverflow.com/questions/5932677/initializing-a-property-dot-notation/5932733#5932733 – justin

+0

@Justin : 답변 끝 부분에서 서브 클래 싱을 언급했습니다. – dreamlax

+0

예. 나는 그것이 논평하기 전에 그것을 보았다. – justin