카테고리와 클래스 확장의 차이점은 무엇입니까?


85

카테고리와 클래스 확장의 차이점은 무엇입니까? 둘 다 기존 클래스에 사용자 지정 메서드를 추가하는 데 사용된다고 생각합니다. 누군가 이것에 빛을 던질 수 있습니까? 코드를 사용한 예는 정말 감사하겠습니다.



3
Akusete, 페이지를 찾을 수 없습니다.
Adil Hussain

분명히, 여기에 설명 code.tutsplus.com/tutorials/...
grassyburrito

답변:


103

범주는 기존 클래스에 메서드를 추가하는 방법입니다. 일반적으로 "NSView + CustomAdditions.h"(물론 .m)와 같이 "Class + CategoryName.h"라는 파일에 있습니다.

클래스 확장은 두 가지 주요 차이점을 제외하고 범주입니다.

  1. 카테고리에는 이름이 없습니다. 다음과 같이 선언됩니다.

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @종료
  2. 확장의 구현은 있어야 파일의 주요 @implementation 블록에합니다.

.m 파일의 맨 위에 클래스에 대해 더 많은 메서드를 선언하는 클래스 확장을 보는 것은 매우 일반적이며, 클래스의 기본 @implementation 섹션에서 아래에 구현됩니다. 이것은 "의사-개인"메서드를 선언하는 방법입니다 (실제로 개인이 아니라 외부에 노출되지 않는다는 점에서 의사-개인).


13
Class-Extensiosn에서는 (공용) 읽기 전용 속성의 속성을 내부적으로 읽기 쓰기로 덮어 쓸 수 있습니다. 그리고 LLVM 1.5 이후로 더 많은 작업을 할 수 있습니다. 이제 클래스 확장에서 인스턴스 변수를 선언하여 일반 인터페이스에서 제거 할 수 있습니다.
Max Seelemann

클래스에 제한된 메서드와 속성을 구현할 수 있는데 왜 클래스 확장을 추가합니까? 나에게는 약간 중복되는 것 같습니다.
user1721803

1
@ user1721803 Dave가 제안한대로 몇 가지 속성 / 메소드를 노출되지 않은 상태로 유지할 수 있습니다. 확장이 사용되는 경우입니다. 보기를 고려하면 확장에서 모든 IBOutlet 및 IBAction을 연결하고 Outlet을 초기화 / 업데이트 할 수있는 메서드를 노출 할 수 있으며 Actions는 다시 위임 될 수 있습니다.
GoodSp33d

@MaxSeelemann 짧은 스크립트로 "(공용) 읽기 전용 속성을 내부적으로 읽기 전용으로"만드는 방법을 시연 해 주시겠습니까? 감사.
allenlinli

이 답변 은 "Class + CategoryName.swift"파일의 확장자를 나타냅니다. 맞습니까?
Ritesh.mlk

47
  1. 범주

=> Objective C에서 상속없이 클래스에 더 많은 기능을 추가하려면 범주를 사용하면됩니다.

=> 자체 .h.m 파일 과 함께 제공 됩니다.

=> Category속성이 아닌 새 메서드를 추가하는 데 사용합니다.

  1. 클래스 확장
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

참고 : 새 파일을 추가하고 목표 c 카테고리의 옵션을 선택하면 카테고리가 "하위 클래스"가 아닌 "카테고리에"표시되므로 다음과 같이 표시됩니다.

@interface className (categoryName)
@end

- 파일 이름이 ( className + categoryName.hclassName + categoryName.m ) 인 두 개의 파일 .h.m 이 생성됩니다.

그리고 확장의 경우 당신은 얻을 것입니다

@interface className()
@end

- 당신은 같은 이름을 가진 하나의 파일을 얻을 것이다 className_extensionName.h

  • 카테고리에서 당신은 클래스를 소유하지 않지만 확장에서는 당신입니다.

5
@Prasanna : 클래스 확장자는 .m 파일에만 제공되고 .h에는 제공되지 않습니다
Saggy

1
클래스 확장은 .H 파일 만이 아닌하는 .m 온다
Nishu_Priya

32
  1. 카테고리는 소스 코드의 사용 가능 여부에 관계없이 클래스에 메소드를 추가하는 방법입니다. 즉, NSString사용자 정의 클래스와 같은 기초 클래스에 카테고리를 추가 할 수 있습니다 .

    컴파일러는 소스 코드와 확장을 동시에 컴파일하기 때문에 소스 코드를 사용할 수있는 클래스에만 확장을 추가 할 수 있습니다.

  2. 클래스 확장에는 추가 인스턴스 변수와 속성을 추가 할 수 있지만 카테고리에는 추가 할 수 없습니다.

  3. 확장 내부의 모든 변수 및 메서드는 상속 된 클래스에 액세스 할 수도 없습니다.

  4. 카테고리와 확장은 모두 기본적으로 큰 코드베이스를 처리하기 위해 만들어졌지만 카테고리는 여러 소스 파일에서 클래스 API를 확장하는 방법이고 확장은 기본 인터페이스 파일 외부에 필요한 메서드를 추가하는 방법입니다.

  5. 다른 기능에 따라 동일한 클래스 코드를 다른 소스 파일로 분리해야하는 경우 카테고리를 사용하고 기본 인터페이스 파일 외부의 기존 클래스에 필요한 메소드를 추가해야하는 경우 확장을 사용하십시오. 또한 클래스에서 공개적으로 선언 된 인스턴스 변수를 수정해야하는 경우 (예 : readonly에서 readwrite로) 확장에서 다시 선언 할 수 있습니다.


3
답이 많은 5 개의 비슷한 질문을 읽었는데 이것이 최고입니다. 감사합니다!
Honey

1
카테고리에 속성을 추가 할 수도 있습니다. @Pebby 답변을 참조하십시오.
atulkhatri

7

확장 : 메서드를 비공개로 만들고 Apple 클래스가 아닌 자체 사용자 정의 클래스의 속성을 추가합니다.

카테고리 : 속성이 아닌 기존 클래스에 더 많은 메소드를 추가하려면 사용자 정의 클래스와 NSString.


간단하고 우아합니다. 그것을 유지
압둘 야신에게

3

범주 클래스에서 관련 속성 설정을 사용하여 속성을 가질 수도 있습니다.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

참조 : http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/


2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

카테고리를 선언하는 방법이 아니라고 생각합니다. 카테고리에는 이름이 있어야합니다.

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

예를 들면

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Apple에서 NSMutableArray에 대해 선언


이것이 카테고리가 아니라 선언하고 확장하는 방법입니다-> @interface SomeClass ()
ChavirA

0

c #, java 추상 클래스 또는 인터페이스와 유사한 ios 확장
c #, java 클래스 확장과 유사한 ios 범주


4
"고양이는 호랑이와 비슷해서 눈먼 사람에게 대답한다"와 같이 대답합니다. Lol
Muruganandham K

1
실제로는 아닙니다. c # 또는 java를 아는 경우 가장 직접적이고 빠른 설명입니다.
Add080bbA

그다지 설명 적이 지 않고 질문에 거의 대답하지 않았습니다.
KVISH

0

카테고리

카테고리는 메서드가 많이 포함 된 파일을 생성 할 때 사용되므로 단일 클래스를 다른 모듈로 분리 할 수있는 기능을 제공합니다. 또한 카테고리를 변경해도 컴파일러는 전체 프로젝트를 컴파일하는 데 시간을 낭비하지 않습니다. . 카테고리는 새 변수 또는 속성을 추가하고 부모 클래스를 조회 할 수 없습니다. 카테고리의 메소드를 재정의 할 수 있지만 메서드를 더 이상 재정의 할 수 없기 때문에 좋은 생각이 아닙니다. 또한 모든 범주가 동일한 계층 수준이므로 동일한 부모 클래스에 속하는 두 개의 범주가 런타임에 존재할 수 있습니다. 또한 보호 된 메서드는 범주를 사용하여 만들 수 있습니다.

확장

확장 기능을 사용하면 속성을 재정의하거나 기존 부모 클래스에 새 속성을 추가 할 수 있습니다. 구문 적으로 이름이없고 @interface class ()로 표시되는 범주와 동일합니다. 부모 파일의 @implementation에서

링크 에서 추가 도움말


0

내 이해는 다음과 같습니다.

확장은 일반적으로 자체 " 사용자 정의 클래스 " 에 추가 기능을 추가하는 데 사용됩니다 . 클래스 구현 내에서 사용할 수있는 클래스 인터페이스를 확장하는 개인 메서드 또는 속성을 추가 할 수 있습니다.

확장자는 클래스와 동일한 파일 내에 작성됩니다. 따라서 String, Float 등과 같은 미리 정의 된 유형에 대한 확장을 작성할 수 없습니다.

반면에 카테고리를 사용하여 기존 클래스에 추가 메서드를 추가 할 수 있습니다. 예를 들어 String 클래스를 확장하여 자체 메서드를 만들 수 있습니다. 우리가 참고 추가 속성을 만들 수 없습니다 범주에 있습니다. 또한 카테고리의 주요 장점은 클래스가 종료되는 파일 외부의 다른 파일에 카테고리를 작성할 수 있다는 것입니다.

또한 카테고리를 만드는 동안 괄호 안에 이름을 지정해야합니다. 그러나 확장에는 이름이 필요하지 않습니다. 따라서 때로는 익명 범주라고도합니다.


당신은 궤도에서 약간 벗어났습니다.
Abdul Yasin 2018 년

@iPhoneDeveloper 사전 정의 된 유형에 대한 확장을 작성할 수 있습니다. -이 링크를 확인하시기 바랍니다 stackoverflow.com/a/33942484/2060508
yo2bh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.