NSArray가 바로 그런 것임을 읽었습니다. 무겁게 들립니다. 저는 Objective-C, Cocoa, C에 관한 7 권의 책을 책상에 가지고 있습니다. 그들 중 누구도 Class Cluster를 전혀 언급하지 않았습니다. 적어도 책 뒷면의 Index에서는 찾을 수 없습니다. 그래서 그것은 무엇입니까?
NSArray가 바로 그런 것임을 읽었습니다. 무겁게 들립니다. 저는 Objective-C, Cocoa, C에 관한 7 권의 책을 책상에 가지고 있습니다. 그들 중 누구도 Class Cluster를 전혀 언급하지 않았습니다. 적어도 책 뒷면의 Index에서는 찾을 수 없습니다. 그래서 그것은 무엇입니까?
답변:
애플의 문서에서 ... . 간단히 말해 Foundation 프레임 워크에서 사용되는 디자인 패턴이므로 ObjC 책에서 언급되지 않은 것 같습니다.
클래스 클러스터는 공용 추상 슈퍼 클래스 아래에 여러 개인의 구체적인 하위 클래스를 그룹화하는 아키텍처입니다. 이러한 방식으로 클래스를 그룹화하면 공개적으로 표시되는 아키텍처 만 보는 사용자에게 단순화 된 인터페이스가 제공됩니다.
Steve가 참조한 CDP에 무엇이 있는지 모르겠지만 기본적으로 Objective-C Class Cluster는 추상 팩토리 패턴 구현을 지원하는 구성입니다 .
아이디어는 간단하다 : 당신은 공장을 제공 할 (클러스터) 인터페이스 최소한의 설명과 함께, 제조 및 반환 팩토리 객체의 특정의 구체적인 인스턴스 것을 만족 공장 (클러스터) 인터페이스에 의해 기술 클러스터 가족의 동작.
간단한 구체적인 예 :이 예는 특정 웃음 유형 (예 : Guffaw, Giggle)의 구체적인 클래스를 생성하는 Laugh 팩토리를 제공합니다. Laugh initWithLaughter : 메소드에 주의하십시오 .
Laugh.h에서 :
#define kLaughWithGuffaw 1
#define kLaughWithGiggle 2
@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end
Laugh.m에서 :
@interface Guffaws:Laugh {}
- (void) laugh;
@end
@interface Giggles:Laugh {}
- (void) laugh;
@end
@implementation Laugh
- (Laugh *) initWithLaughter:(NSUInteger) laugherType {
id instanceReturn=nil;
; // Removed for ARC [self release]
if ( laughterType == kLaughWithGuffaw )
instanceReturn = [[Guffaws alloc]init];
else if( laughterType == kLaughWithGiggle )
instanceReturn = [[Giggles alloc]init];
else
; // deal with this
return instanceReturn;
}
- (void) laugh {
NSLog(@"Humbug");
}
@end
@implementation Guffaws
- (void) laugh {
NSLog(@"OH HA HA HOWAH HA HA HA");
}
@end
@implementation Giggles
- (void) laugh {
NSLog(@"Tee hee");
}
@end
.m-file
.
init
메서드 에서 자신을 해제 하고 다른 것을 반환 하는 것이 얼마나 안전 합니까? 이 작업을 수행하는 Apple의 코드 예제가 있습니까? (2) 또한 아마도 [[Laugh alloc] initWithLaughter:kLaughWithGiggle]
. Laugh
이 호출 직후에 해제되므로 불필요하게 할당되는 방법을 확인 하십시오. [Laugh laughWithLaughter:kLaughWithGiggle]
위의 문제 1 및 2를 피하면서 개인 하위 클래스의 모든 이점을 제공 하는 클래스 메서드를 만들 수 있는데 왜 이런 식으로 수행 합니까?
+alloc
에서 다양한 -initWith:
메서드 를 구현하는 단일 팩토리 클래스를 반환 합니다. 공장 클래스의 -initWith:
방법이 필요한 경우, 지정된 메소드 매개 변수를 기반으로 구체적인 서브 클래스를 할당하고 초기화에 대한 책임, 또는 어떤 경우에는 모든 (예에서 아무것도를 할당 할 수 있습니다 -[NSString initWithString:]
). 당신의 반환 값에 검사하여 시도 할 수 있습니다 +[NSString alloc]
, +[NSArray alloc]
등
용어집의 498 페이지에있는 Stephen Kochan의 목표 c 프로그래밍에서 클러스터 :
추상 클래스를 통해 사용자에게 단순화 된 인터페이스를 제공하는 개인용 구체적인 하위 클래스 집합을 그룹화하는 추상 클래스입니다.
클래스 클러스터는 구체적인 개인 서브 클래스 구현 그룹에 단일 공용 인터페이스를 제공합니다. Objective-c 프로그래머는 클래스 클러스터를 자주 사용하고 거의 인식하지 못합니다. 이것이 클래스 클러스터의 전체 요점입니다. 클래스 클러스터의 역할은 공용 인터페이스 뒤에 구현 세부 사항의 복잡성을 숨기는 것입니다.
많은 Foundation 클래스는 NSString, NSArray, NSDictionary 및 NSNumber와 같은 클래스 클러스터입니다. [NSString stringWithFormat:]
클래스 클러스터 를 호출 하면 NSString
인터페이스 를 구현하는 구체적인 클래스가 제공 됩니다. 그것은이 될 수있다 NSConcreteString
, NSCFString
, NSFooBarString
, 등 어떤 클래스 클러스터가 생성자에 따라 또는 호출하고 인수하는 초기화되어 있습니다.
이 때문에 클래스 클러스터는 Objective-C 프로그래밍에서 가장 강력한 개념 중 하나입니다.
다른 언어에서 온 경우 Gang of Four 패턴에 익숙 할 것입니다. 클래스 클러스터에는 추상 팩토리와 파사드 패턴 모두의 요소가 있습니다.
Apple의 공개 문서는 클래스 클러스터 (및이를 구현하고 확장하는 방법)를 상당히 광범위하게 다룹니다. 불행히도 많은 iOS 개발자들에게이 패턴과 다른 Cocoa 특정 패턴은 사각 지대라는 것을 알게되었습니다.
NSArray 클래스 클러스터는 "무거운"것이 아니며, 코드가 특정 구현을 인식하거나 신경 쓰지 않고도 배열 클래스의 여러 구현을 사용할 수있는 방법입니다. 내부적으로는 대규모, 희소 배열 또는 컴파일 시간에 알려진 특정 수의 요소를 포함하는 배열과 같은 다양한 사용 사례에 적합한 NSArray의 구체적인 하위 클래스가 있습니다.
NSArray, NSString 및 NSNumber는 가장 자주 접하게되는 클래스 클러스터입니다.
[myArray isKindOfClass:[NSMutableArray class]]
YES를 반환 하지 않더라도 YES를 반환하지 않습니까?