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

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



답변

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

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

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

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    

    @종료

  2. 확장의 구현은 있어야 파일의 주요 @implementation 블록에합니다.

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


답변

  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

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


답변

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

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

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

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

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

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


답변

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

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


답변

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

@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/


답변

@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에 대해 선언


답변

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

c #, java 클래스 확장과 유사한 ios 범주