2013-02-12 1 views
1

NSCopyingNSMutableCopying을 준수하는 맞춤 클래스를 만들었습니다.-mutableCopyWithZone 사용 : 맞춤 클래스에서 변경 불가능하게 함

나는 -copyWithZone:-mutableCopyWithZone:에 대한 구현을 추가했습니다,하지만 난 내 개체에 -mutableCopy를 호출하고 다른 방법을 호출 할 때마다 인스턴스 변수 중 일부는 불변되기 때문에, 그것은 내가 인스턴스 변수에 -mutableCopyWithZone: 전화에도 불구하고, 충돌합니다.

MyObject *flipped = [list mutableCopy]; 
[MyObject flip:flipped]; 

다음

내가 복사하고있어 방법 (코드 +flip:에 실패 그것이 NSMutableArray 바르에 removeObjectAtIndex:addObject:를 사용하려고하기 때문에,) : 나는 내 수업을 복사 해요 방법은 다음과

입니다 수업 :

- (id)mutableCopyWithZone:(NSZone *)zone { 

    id instance = nil; 

    if ((instance = [[[self class] alloc] init])) { 

     [instance setArray:[self.array mutableCopyWithZone:zone]]; 
     [instance setObjects:[self.objects mutableCopyWithZone:zone]]; 

     [instance setItemCount:self.itemCount]; 

    } 

    return instance; 

} 

내가 왜 실패하고 있는지 잘 모르겠지만 왜 그렇게하지 않는지 이해할 수 없다. arrayobjects을 변경할 수 있습니다.

도움을 주시면 감사하겠습니다.

+1

"NSMutableArray ivar에서 removeObjectAtIndex : 및 addObject :를 사용하려고하므로 + flip :에서 코드가 실패합니다."- 실제로는 NSMutableArray입니까? –

+0

배열 또는 객체 속성이'copy'로 선언되어 있습니까? –

+0

런타임시 NSMutableArray가 아니며 __NSArrayI이지만 코드에서 NSMutableArray로 정의됩니다. –

답변

3

내 마지막 아이디어는 다음 setArray:setObjects: 방법이 있다면 실제로 그 때 전달 된 배열을 복사 한 것, @property (copy)로 선언 된 속성에 대한 세터 - 그리고 copy은 항상 불변의 객체를 반환한다. 이 경우 쉽게 해결할 수있는 방법은 (copy) 대신 (retain)으로 선언하는 것입니다.

+2

이것이'copy' 내부에 있다고 생각하면, 나는 set 접근자를 사용하는 대신에 새로운 인스턴스의 ivars를 직접 설정하는 것이 좋습니다. –

+0

@StevenFisher이 문제는 아래에 있습니다. 변경 가능한 개체를 속성으로 사용해서는 안됩니다. –

+0

동의 함. 나는 속성이 메모리 관리 목적으로 만 여기에서 사용되었다는 가정을 부추겼다. –