2011-08-21 1 views
67

클래스 확장 @interface Class()은 훨씬 강력하고 클래스에 변수를 주입 할 수 있습니다. 카테고리 @interface Class (Category) 수 없습니다.클래스 확장 vs 클래스 카테고리

다른 차이점이 있으며 클래스 확장을 통해 카테고리를 사용해야하는 경우는 언제입니까?

+0

카테고리는 실제 코드입니다. 클래스에 기능을 추가하는 방법입니다. 확장은 (매우 일반적으로) 구문 론적 설탕 일 뿐이며, 프라이버시 등에 관한 특정 아이디어를 다른 프로그래머에게 알리기위한 것입니다. 확장 프로그램에는 코드가없고 코드가 아닙니다. – Fattie

+0

Swift에서 사용되는 확장 기능에 대해서는 다음 질문을 참조하십시오. http://stackoverflow.com/questions/24142829/how-to-create-swift-class-for-category – Suragch

답변

77

주요 차이점은 컴파일러는 확장자가 @implementation 인 반면 카테고리가있는 경우 @implementation 블록을 사용한다고 가정합니다. 따라서 메인 .m 파일 (덧붙여서 귀찮은 부분을 신경 써야하는 유일한 장소) 상단에 확장자를 사용해야합니다. 즉, 확장자 인 것을 의미합니다.

+3

그렇다면 확장 기능을 사용하는 시점은 무엇입니까? 범주? – David

+32

확장은'.m' 파일에서 선언하고 싶은 private 메소드에 가장 좋습니다. 나는 이것을 항상 이것을 위해 사용한다. 카테고리는 메소드를 다른 섹션 (* categories * :)으로 그룹화하려는 경우 또는 작성하지 않은 기존 클래스에 코드를 추가하려는 경우에 더 유용합니다. – jtbandes

+1

속성을 사용하여 클래스 확장 인 저장소를 추가 할 수도 있습니다. –

3

범주는 기존 클래스에 새 메서드를 추가 할 수있게 해주는 Objective-C 언어 기능입니다. 확장은 주 구현 블록에서 구현해야하는 메소드를 정의 할 수있게 해주는 특별한 경우의 카테고리입니다.

개인 선언은 클래스 확장에있을 수 있습니다.이 선언은 메소드를 호출하기 전에 선언 할 필요가 없기 때문에 주로 일부 속성입니다. C#을, 자바 추상 ​​클래스 또는 인터페이스
IOS 카테고리 비슷한 C에 # 클래스 확장에 비슷한

+0

"을 주 구현 블록에서 선언해야합니다." 메인 구현 블록에서 "구현"되어야합니다. – Fawkes

+0

고마워, 그것을 수정했습니다. –

0

IOS 확장

+0

Java는 확장 방법을 지원하지 않습니다 – someUser

+0

죄송합니다! 복사하여 오타를 붙여 넣습니다. C# 클래스 확장과 유사합니다. – Add080bbA

15

는 클래스 확장 범주에 약간의 유사성을지지하지만, 그것은 단지 클래스에 추가 될 수있는 당신은 컴파일 타임에 소스 코드를 가지고있다 (클래스는 클래스 확장과 동시에 컴파일된다). 클래스 확장으로 선언 된 메서드는 원래 클래스의 @implementation 블록에 구현되므로 예를 들어 NSString과 같은 Cocoa 또는 Cocoa Touch 클래스와 같은 프레임 워크 클래스에 클래스 확장을 선언 할 수 없습니다.

클래스 확장을 선언하는 구문은 카테고리의 구문과 유사하고, 다음과 같습니다 : 더 이름이 괄호 안에 표시되지

@interface ClassName() 
@end 

때문에, 클래스 확장은 종종 익명의 범주라고합니다 .

일반 범주와 달리 클래스 확장은 자체 속성과 인스턴스 변수를 클래스에 추가 할 수 있습니다. 클래스 확장에서 다음과 같이 속성을 선언하는 경우 :

@interface XYZAnimal() { 
    id _someCustomInstanceVariable; 
} 
... 
@end 

IMHO, 클래스 확장을 개인용 인터페이스로 생각하는 것이 가장 좋습니다. 기본 인터페이스 (.h 파일)는 다른 클래스와 클래스의 행동 계약을 정의하는 공용 인터페이스 역할을합니다.

사용 클래스 확장

클래스 확장은 종종 클래스 자체의 구현 내에서 사용하기위한 추가 개인 메서드 나 속성과 공용 인터페이스를 확장하는 데 사용되는 개인 정보를 숨 깁니다. 예를 들어 인터페이스에서 읽기 전용으로 속성을 정의하는 것이 일반적이지만 클래스의 내부 메서드가 속성 값을 직접 변경할 수 있도록 구현 위에 선언 된 클래스 확장에서 읽기 쓰기로 정의하는 것이 일반적입니다.

예를 들어, XYZPerson 클래스는 uniqueIdentifier라는 속성을 추가하여 미국 사회 보장 번호와 같은 정보를 추적 할 수 있습니다.

현실 세계에서 개인에게 고유 한 식별자가 할당되어 있어야하므로 일반적으로 XYZPerson 클래스 인터페이스는이 속성을 읽기 전용으로 선언하고 식별자를 할당하도록 요청하는 몇 가지 방법을 제공합니다 이 :

XYZPerson 클래스는 내부적으로 속성을 변경 할 수 있기 위해서는
@interface XYZPerson : NSObject 
    ... 
    @property (readonly) NSString *uniqueIdentifier; 
    - (void)assignUniqueIdentifier; 
@end 

, 그것은 클래스의 구현 파일의 상단에 정의되어 클래스 확장에 속성을 재 선언하는 것이 합리적이다 :

@property (readwrite) NSString *uniqueIdentifier; 

참고 : readwrite 속성은 기본값이므로 선택 사항입니다. 명료성을 위해 재산을 재 선언 할 때 사용하는 것이 좋습니다.

-1

카테고리는 기존 클래스의 API를 확장하는 방법이며 확장은 기본 인터페이스 파일 외부의 API에 필수 메소드를 추가하는 방법입니다. 이 두 가지 모두 초기에 대규모 코드 기반을 유지 관리해야하는 부담을 덜어주기 위해 고안되었습니다. 사용하는 종류의

주의 사항 : 당신은 안정적 같은 클래스의 범주에 정의 된 메소드를 재정의 할 수 없습니다

1.

2- 범주에서 인스턴스 변수를 추가 할 수 없습니다. 즉, 새 속성을 선언 할 수 없습니다.

참조 : Objective-C Succinctly: Categories and Extensions. 예제와 함께 자세한 논의가 있습니다.