2014-06-08 6 views
0

현재 Xcode의 숫자가있는 타일 기반 게임을하고 있습니다. checkGameOver라는 메서드에서 모든 타일은 가능한 모든 조합으로 이동하고 유효 이동되었는지 확인합니다. 그러나이 메서드는 'values'라는 가변 배열을 변경하므로이 방법을 피하는 가장 쉬운 방법은 '값'의 복사본을 만들어 'originalValues'에 저장 한 다음 나중에 복원하는 것입니다. 그러나 실제로 되돌아 가지 않는 것처럼 보입니다. 나는 사본을 사용하여 시도했다. 왜 작동하지 않는지 나는 이해하지 못한다. checkGameOver는 실제로 수천 번의 계산 때문에 가능할 수 있으며 값이 다시 변경 될 때까지 완료되지 않을 수 있습니까?arrayWithArray가 값을 재설정하지 않습니다.

NSArray *originalValues = [NSMutableArray arrayWithArray:values]; 
    [self checkGameOver]; 
    values = [NSMutableArray arrayWithArray:originalValues]; 

설명 : 배열 A (값)을 가지고 있는데, 그 배열 B (originalValues)의 복제본을 만듭니다. 나는 A를 변경하지만 그 변경 사항은 B에도 반영됩니다.

+1

무엇이 바뀌고 있습니까? 문제가 명확하지 않습니다. 개별 값이 변경됩니까? – rmaddy

+0

checkGameOver-method가 'value'(배열)을 변경하고 있습니다. 이러한 변화를 예전의 모습으로 되 돌리려고합니다. – Runar

+0

* 왜 그 방법이 그것을 바꿀까요? 필요한 경우 다른 데이터 저장소를 사용하여 배열을 변경하지 않도록 수정하십시오. – trojanfoe

답변

1

NSArray의 전체 복사본을 만들고 싶다면 보관 기능을 사용해야합니다. 다음 예를 참조하십시오.

NSMutableArray *values = [@[@"one", @"two"] mutableCopy]; 
NSData *originalValues = [NSKeyedArchiver archivedDataWithRootObject:values]; 

[values replaceObjectAtIndex:1 withObject:@"something"]; 
NSLog(@"changed: %@", values); 
values = [NSKeyedUnarchiver unarchiveObjectWithData:originalValues]; 
NSLog(@"restored: %@", values); 
+0

정말 고마워요. 그것으로 해결되었습니다. Great :) 그래도 나는 왜 이해했으면 좋겠다. – Runar

+0

배열은 객체에 대한 포인터를 저장합니다. 배열에 객체를 추가 할 때는 메모리 주소를 추가하기 만하면됩니다. 어쩌면 이렇게하면 깊은 사본의 아이디어를 이해하는 데 도움이됩니다. http://en.wikipedia.org/wiki/Object_copy#Deep_copy – Adam

+0

대단히 감사합니다. :) – Runar

관련 문제