2012-07-05 2 views
1

핵심 데이터가있는 카테고리를 사용하고 있습니다. 제가 읽은 튜토리얼과 강의 중 일부는 종종 범주가 "나쁜"습관으로 간주됩니다. 그러나 Objective-C는 매우 역동적이기 때문에 클래스의 공용 속성 만 사용할 수 있기 때문에 다른 곳에서 메서드를 정의해도 괜찮습니다. 카테고리를 사용할 때주의해야 할 함정은 무엇입니까? 아니면 카테고리가 실제로 나쁜 습관 인 이유가 있습니까? 핵심 데이터와 함께 사용하는 이유는 내가 서브 클래스를 재생성 할 때마다 추가 기능 메소드를 다시 작성하지 않기 때문입니다.카테고리가 언제/위험합니까?

+1

반 - 카테고리 의견을 본 적이있는 유일한 시간은 기존 방법을 재정의하려는 시도입니다. 일반적인 경우 나쁘다면 SDK 및 샘플 코드에서 얼마나 자주 사용되는지 고려하여 많은 수의 Apple 소프트웨어 엔지니어를 놀라게 할 것입니다. –

답변

6

내가 생각할 수있는 유일한 위험은 서브 클래 싱하지 않고 원래 클래스의 메서드를 대체 할 때 사용하는 것입니다.

이렇게하면 원래 구현에 액세스 할 수 없게됩니다.이 구현은 일반적으로 재정의하는 개인 메서드이기 때문에 예상치 못한 결과가 발생할 수 있습니다.

특정 클래스의 모든 객체에 엑스트라 메쏘드를 추가하는 카테고리를 사용하는 것은 훌륭하고 정확하게 수행 할 수 있습니다. 코어 데이터를 핵심 데이터로 사용하면 코드를 변경하지 않고도 모델을 변경하고 "바닐라"객체를 다시 생성 할 수 있기 때문에 잘 수행됩니다. 모자의

팁 사과에서 문서의이 비트에 대한 @CodaFi합니다 : Objective-C 언어는 현재 당신이 선언 된 클래스는 상속 방법, 또는 메소드를 오버라이드 (override) 카테고리를 사용할 수 있습니다

있지만 클래스 인터페이스에서는 그렇게하지 않는 것이 좋습니다. 카테고리는 서브 클래스를 대신 할 수 없습니다. 범주를 사용하여 메서드를 재정의하는 데는 몇 가지 중요한 단점이 있습니다.

범주가 상속 된 메서드를 재정의하는 경우 범주의 메서드는 평상시처럼 상속 된 구현을 super로 메시지를 통해 호출 할 수 있습니다. 그러나 카테고리가 클래스의 클래스에있는 메소드를 대체하는 경우 원래 구현을 호출 할 방법이 없습니다.

범주는 동일한 클래스의 다른 범주에서 선언 된 메서드를 안정적으로 재정의 할 수 없습니다.

이 문제는 많은 코코아 클래스가 범주를 사용하여 구현되기 때문에 특히 중요합니다. 재정의하려고하는 프레임 워크 정의 메소드 자체가 카테고리에 구현되었을 수 있으므로 어떤 구현이 우선 적용되는지는 정의되지 않습니다.

일부 범주 메서드가있는 경우 모든 프레임 워크에서 동작이 변경 될 수 있습니다. 예를 들어, NSObject의 카테고리에서 windowWillClose : delegate 메소드를 오버라이드하면 프로그램의 모든 윈도우 델리게이트가 category 메소드를 사용하여 응답합니다. NSWindow의 모든 인스턴스의 동작이 변경 될 수 있습니다. 프레임 워크 클래스에 추가하는 카테고리로 인해 동작이 신비하게 변경되어 충돌이 발생할 수 있습니다.

+0

답변을 주셔서 감사합니다. 구현이 우선시되는 부분은 특히 흥미 롭습니다. – Dustin

관련 문제