2010-04-02 4 views
10

여기서 명백한 것이 누락되었지만 내 개체 중 하나에서 NSCopying을 구현 중입니다. 이 객체에는 getter를 통해 노출되지 않는 private 인스턴스 변수가 있습니다. 객체 외부에서 사용하면 안되기 때문입니다.NSCopying을 사용하여 개인 인스턴스 바를 복사하는 모범 사례

제 구현에서 copyWithZone:을 할당하려면 새 인스턴스를 할당/초기화해야하지만 현재 인스턴스와 일치하도록 상태를 설정해야합니다. 내부의 copyWithZone:에서 분명히 현재 개인 상태에 액세스 할 수 있지만 그 상태에 대한 접근자가 없으므로 새 객체로 설정할 수는 없습니다.

데이터 프라이버시를 그대로 유지하면서 표준적인 방법이 있습니까?

감사합니다.

답변

8

첫째, 당신은 항상 개인 경우에도, 게터이 있어야합니다. 객체는 접근자를 사용하여 자체 ivars에만 액세스해야합니다 (매우 적은 수의 경우 제외). 이렇게하면 메모리 관리보다 많은 고통을 덜 수 있습니다.

둘째, 위의 getters 규칙을 위반하더라도 Alex가 제안한 -> 사용 방법이 표준 방식입니다. 해당 규칙에는 예외가 거의없고 사본은 다음 중 하나입니다. 여기에 개인 설정 도구를 사용하는 것은 여전히 ​​합리적입니다 (그리고 전 독점적으로 그렇게했습니다). 그러나 자주 -> 사용하는 것이 더 깨끗하게 작동한다는 여러 가지 이유로 발견되었습니다.

메모리 관리가 정확하도록주의하십시오. [super copyWithZone:]에 전화해야하는 경우 NSCopyObject()의 복잡성과 사용자가 직접 사용하지 않는 경우에도 영향을받는 방법을 읽어야합니다. 나는 길이면에서 이것을 논의했다. "NSCopyObject() considered harmful."

+0

NSCopyObject의 위험뿐만 아니라 사적인 접근자를 언급 해 주셔서 감사합니다. –

+0

readonly 접근자가 메모리 관리에 어떻게 도움이되는지 잘 모르겠습니다. 'assign' 또는'retain'과 함께 사용하지 않는다면, getter 나 변수를 직접 사용하든 상관 없습니다. – Hemant

+0

@Hemant, 호출자는 속성이 현재 (또는 앞으로) 읽기 전용인지 아닌지에 대해 신중할 필요가 없기 때문에. 그것은 호출자의 비즈니스가 아니며 시간이 지남에 따라 변경 될 수 있습니다. 그러면 잘못 수행 한 코드를 모두 찾아야합니다. 간단한 규칙을 고수함으로써 오류가 분명해진다. 당신이 "오, 내가 그것이 현재 괜찮다는 것을 알게 될 때를 제외하고"라고 말할 때, 당신은 유지 보수의 골치 거리에 스스로를 열어 놓고 있습니다. –

5

복사본의 인스턴스 변수에 직접 액세스 할 수 있습니다. 구조체와 함께 사용할 동일한 포인터 역 참조 구문을 사용합니다. 따라서, 예를 들어, 수업이있는 경우 :이 작업을 수행 할 수 있습니다

@interface MyCopyableClass : NSObject { 
    int anInstanceVariable; 
} 
@end 

:

- (id)copyWithZone:(NSZone *)zone { 
    MyCopyableClass *theCopy = [[[self class] allocWithZone:zone] init]; 
    theCopy->anInstanceVariable = anInstanceVariable; 
    return theCopy; 
} 
1

개인 iVar 값을 받아들이는 사용자 정의 이니셜 라이저를 만드는 방법이있다. 따라서 다음과 같이 작성하십시오.

사본을 인스턴스화 할 때 사용자 정의 초기화 프로그램을 사용하십시오.