카테고리와 클래스 확장의 차이점은 무엇입니까? 둘 다 기존 클래스에 사용자 지정 메서드를 추가하는 데 사용된다고 생각합니다. 누군가 이것에 빛을 던질 수 있습니까? 코드를 사용한 예는 정말 감사하겠습니다.
답변
범주는 기존 클래스에 메서드를 추가하는 방법입니다. 일반적으로 “NSView + CustomAdditions.h”(물론 .m)와 같이 “Class + CategoryName.h”라는 파일에 있습니다.
클래스 확장은 두 가지 주요 차이점을 제외하고 범주입니다.
-
카테고리에는 이름이 없습니다. 다음과 같이 선언됩니다.
@interface SomeClass ()
- (void) anAdditionalMethod;
@종료
-
확장의 구현은 있어야 파일의 주요 @implementation 블록에합니다.
.m 파일의 맨 위에 클래스에 대해 더 많은 메서드를 선언하는 클래스 확장을 보는 것은 매우 일반적이며, 클래스의 기본 @implementation 섹션에서 아래에 구현됩니다. 이것은 “의사-개인”메서드를 선언하는 방법입니다 (실제로 개인이 아니라 외부에 노출되지 않는다는 점에서 의사-개인).
답변
- 범주
=> Objective C에서 상속없이 클래스에 더 많은 기능을 추가하려면 범주를 사용하면됩니다.
=> 자체 .h 및 .m 파일 과 함께 제공 됩니다.
=> Category
속성이 아닌 새 메서드를 추가하는 데 사용합니다.
- 클래스 확장
-> 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.h 및 className + categoryName.m ) 인 두 개의 파일 .h 및 .m 이 생성됩니다.
그리고 확장의 경우 당신은 얻을 것입니다
@interface className()
@end
– 당신은 같은 이름을 가진 하나의 파일을 얻을 것이다 className_extensionName.h
- 카테고리에서 당신은 클래스를 소유하지 않지만 확장에서는 당신입니다.
답변
-
카테고리는 소스 코드의 사용 가능 여부에 관계없이 클래스에 메소드를 추가하는 방법입니다. 즉,
NSString
사용자 정의 클래스와 같은 기초 클래스에 카테고리를 추가 할 수 있습니다 .컴파일러는 소스 코드와 확장을 동시에 컴파일하기 때문에 소스 코드를 사용할 수있는 클래스에만 확장을 추가 할 수 있습니다.
-
클래스 확장에는 추가 인스턴스 변수와 속성을 추가 할 수 있지만 카테고리에는 추가 할 수 없습니다.
-
확장 내부의 모든 변수 및 메서드는 상속 된 클래스에 액세스 할 수도 없습니다.
-
카테고리와 확장은 모두 기본적으로 큰 코드베이스를 처리하기 위해 만들어졌지만 카테고리는 여러 소스 파일에서 클래스 API를 확장하는 방법이고 확장은 기본 인터페이스 파일 외부에 필요한 메서드를 추가하는 방법입니다.
-
다른 기능에 따라 동일한 클래스 코드를 다른 소스 파일로 분리해야하는 경우 카테고리를 사용하고 기본 인터페이스 파일 외부의 기존 클래스에 필요한 메소드를 추가해야하는 경우 확장을 사용하십시오. 또한 클래스에서 공개적으로 선언 된 인스턴스 변수를 수정해야하는 경우 (예 : 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 범주