#import <Foundation/Foundation.h>


@interface A : NSObject <NSCopying> { // NSCopying 프로토콜을 따른다.

        int x;

}

-(void) setX:(int)_x;

-(int) x;

@end


@implementation A

-(void) setX:(int)_x

{

    x = _x;

}


-(int) x

{

    return x;

}


-(id)copyWithZone:(NSZone*)zone { // copyWithZone: 메소드의 구현

        A* tempA = [[self class] allocWithZone:zone];

        // 상속할 경우를 대비해서 A 클래스 이름을 직접 사용하는 대신 위와 같이 작성한다.

        

        tempA->x = self->x;        

        return tempA;

}

@end


int main (int argc, const char * argv[]) {

        A* A1 = [A alloc];

        [A1 setX:10];

        

        A* A2 = [A1 copy]; // 사용자 정의 객체의 깊은 복사

    [A2 setX:20]; // 수정이 안되어야 하지 않나? mutable 이 아니니까.

    printf("%d %dn", [A1 x], [A2 x]);

    [A1 release];

    return 0;

}


위 소스에서 제가 궁금한 부분은.


// 상속할 경우를 대비해서 A 클래스 이름을 직접 사용하는 대신 위와 같이 작성한다. 

음... C++ 에서는 그냥 자기 이름으로 new 해도 별 탈 없었는데, (상속 있더라도)

왜 여기선 상속할 경우를 대비해서 그냥 쓰면 안돼? 만약 B 로 상속받으면 self class 가 B  로 바껴? 그게 더 이상한데.. ㅜㅜ


[A2 setX:20]; // 수정이 안되어야 하지 않나? mutable 이 아니니까.

mutableCopy 가 아니니까 수정이 안되어야 맞는거 아니야? 왜 수정해도 아무런 에러가 안나고 정상 작동하지.??


또, copy 된 대상은 release 메시지 안보내줘도 돼??