2011-02-14 7 views
0

현재 복합 개체 사용법을 배우고 있으며 몇 가지 질문이 있습니다.목표 C에서 복합 오브젝트 구성?

  1. 왜 복합 개체를 사용해야합니까? 인스턴스를 사용하려는 클래스가 있지만 완전히 다른 메소드가있는 경우에만 사용합니까?

  2. Rectangle 클래스에서 Square 클래스를 만들고 싶습니다. (저는 Shape라고 부릅니다.) 그러나 Shape 클래스 내에서 initWithHeight : andWidth :를 사용할 계획이 아닙니다. 즉, Square 헤더를 이렇게 선언 할 것입니다. 헤더 파일 구현으로

    @interface Square : NSObject { 
        Shape *square; 
    } 
    
    - (Square*) initWithSide: (int) s; 
    - (void) setSide: (int) s; 
    - (int) side; 
    - (int) area; 
    - (int) perimeter; 
    - (id) free; 
    @end 
    

@implementation Square 
- (Square*) initWithSide: (int) s 
{ 
    if(self = [super init]) 
    { 
     square = [[Shape alloc] initWithHeight:s andWidth:s]; 
    } 

    return self; 
} 
- (void) setSide: (int) s 
{ 
    [square setHeight:s]; 
    [square setWidth:s]; 
} 
- (int) side 
{ 
    return [square width]; 
} 
- (int) area 
{ 
    return [square width]*[square height]; 
} 
- (int) perimeter 
{ 
    return 2*([square width]+[square height]); 
} 
- (id) free 
{ 
    [square release]; 
    return square; 
} 
@end 

질문 : 나는 그것을 수정하고 있는가? 내가 작성한 코드가 다소 이상하다고 생각하기 때문에 복합 객체를 구조화하는 데 더 좋은 방법이나 더 좋은 방법이 있습니까? 특히 메모리 할당을 해제하는 방법. 메인 파일에 [mySquare release]가 있기 때문에 [mySquare release] 이전에 [mySquare free]가 먼저 필요합니다. 메모리 할당을 모두 해제하려면 [mySquare release] 만 호출하면됩니다.

답변

0

기괴하고 잘못된 free 메서드와 누락 된 dealloc (가비지 수집을 사용하지 않는다고 가정 함)을 제외하고는 절대 괜찮아 보입니다.

인스턴스 변수의 이름을 square으로 지정하지 않았을 수 있습니다.

- (id) initWithSide: (int) s 
{ 
    self = [super init]; 
    if(self != nil) 
    { 
     square = [[Shape alloc] initWithHeight:s andWidth:s]; 
     if (square == nil) 
     { 
      [self release]; 
      return nil; 
     } 
    } 
    return self; 
} 

그리고 initialiser의 반환 형식은 항상해야 id


편집 :

또한, square가 succcessfully 할당되어 있는지 확인하기 위해 -init에서 테스트를 고려할 수있는 할당 해제를 위해 방법

-(void) dealloc 
{ 
    [square release]; 
    [super dealloc]; 
} 
+0

-init에서 테스트를 수행하지 않으면 어떻게됩니까? 자유로운 방법이 잘못 되었다면, "사각형"인스턴스에 대한 메모리 할당을 해제하는 더 좋고 올바른 방법은 무엇입니까? – sayzlim

+1

@Sayz Lim : 테스트를 수행하지 않으면 인스턴스 객체가없는 래퍼 객체 만 있습니다. 모든 것이 0/nil을 반환합니다. dealloc 메서드에서 인스턴스 변수를 해제합니다 (update 참조). – JeremyP

+0

@JeremyP dealloc 메소드를 덮어 썼기 때문에, 객체가 더 이상 사용되지 않을 때 release 메소드는 덮어 쓰기 된 dealloc 메소드를 호출 할 것입니다. 덮어 쓴 dealloc은 사각형을 먼저 풀어 주며, 나중에 주 파일에서 생성 된 인스턴스 인 dealloc을 해제합니다. – sayzlim

0

나는 당신의 게시물에 비틀 거렸다. 하지만 귀하의 질문에 회신하지 않습니다. 방금 example project dealing with the composite pattern을 만들었습니다. 어쩌면 도움이 될지도 모른다.
예에서 동일한 방법으로 콘크리트 유형 FooObjectFooCollection에 액세스하려면 FooProtocol 인터페이스를 작성하려고합니다. 이것에 의해, 오브젝트가 가지고있는 타입이 투명하게됩니다. - EnumerableCompositeAppDelegate에서 예를 찾을 수 있습니다. 프로젝트를 컴파일하고 실행하면됩니다.

+0

작성된 세부 정보가 도움이 될 수 있습니다. 코드를 읽는 것만으로는 무엇을 해야할지 잘 모르겠습니다. TBH, Objective-C 환경이 생소하다. – sayzlim