2012-03-26 2 views
1

내 상황 :가장 좋은 방법

ClassA가 또는 유형 ClassB의 부모가되지 않을 수 있습니다. 따라서 [instanceOfA.superview somethingClassBSpecific];을 말하는 것은 위험합니다. 게다가, Xocde는 좋은 이유 때문에 오싹해질 것입니다.

는 통지를 발송하거나 수퍼 일부 로직을, 예를 들면,

if([objectOfA.superview respondsToSelector:somethingClassBSpecific] != nil){ 
    //... 
} 

또는 유형 ClassB 상황 허가의 위임을 만들려면 여기를 추천인가?

답변

3

흔히 그렇듯이 에 달려 있습니다. 뷰 계층 구조, 알림 및 위임을 사용하면 객체가 서로 통신 할 수있는 세 가지 방법이 있습니다. 그것들 (있는 경우) 중 가장 적합한 것이 무엇인지 결정하려면 문제의 대상이 서로 어떻게 관련되어 있는지 생각해야합니다.

알림은 개체간에 매우 느슨한 (거의 제로) 커플 링을 제공합니다. 또한 일대 다 (one-to-many) 통신을 제공합니다. 통지를 게시하면 해당 통지를 수신하는 모든 객체가 메시지를 수신합니다. 그러나 알림이 항상 적절한 것은 아닙니다. 통신은 주로 한 방향으로 만 이루어지며 알림 메커니즘을 악용하면 성능 문제가 발생할 수 있습니다.

위임을 사용하면 개체의 동작을 사용자 지정할 수 있습니다. 가장 확실한 예는 애플리케이션 위임입니다. 대부분의 모든 iOS 응용 프로그램은 동일한 클래스 인 UIApplication을 기반으로합니다. UIApplication은 각 앱이 자체적으로 수행하지만 모든 앱에서 동일합니다. 응용 프로그램 개체는 대리인을 사용하여 응용 프로그램에 고유 한 동작을 제공하는 사용자 지정 기능을 제공합니다.

뷰 계층은 (일부) 객체가 서로 연결되어있는 다른 방법입니다. 구현중인 동작이 a)보기의 일부이고 b) 해당보기의 다른보기와의 관계에 의존하는 경우 superviewsubviews 속성을 사용하는 것이 좋습니다.

그래서 어떤 종류의 기능을 구현하려고합니까?

2

이것은 논리 모델에 따라 다릅니다. 선택적 메소드가있는 프로토콜을 구현하는 클래스의 인스턴스가있는 경우 이러한 선택적 메소드 중 하나를 호출 할 때 respondsToSelector:을 사용하는 것이 적절합니다. 호출하는 메소드를 필수로하려면, 전달하는 클래스에 무조건 "가드"를 작성하십시오. 두 가지 방법 모두 유효합니다. 사용자가 특정 방법을 구현할 필요성을 의식하게 할 것인지 여부 만 문제입니다.