현재 수도 쿠 응용 프로그램에서 작업 중입니다. 숫자는 NSNumbers의 다차원 NSMutableArray 내에 저장됩니다. 그리드에 숫자를 표시하기 위해 SudokuGridView에 배열을 유지합니다. 퍼즐을 풀 때가되면, 퍼즐을 풀기 위해 만든 NSOperation의 서브 클래스에 [grid numberGrid]를 전달합니다.다차원 NSMutableArray 복사
그리드의 배열이 같은 속성으로 정의된다
@property (readonly) NSMutableArray *numberArray;
스도쿠 그리드 솔버에 전달 내가 가서 :
MESudokuSolver *solvePuzzleOperation = [[MESudokuSolver alloc] initWithPuzzle: [grid numberArray]];
initWithPuzzle 그래서 다음과 같이 정의된다
- (id)initWithPuzzle:(NSMutableArray *)puzzleArray {
if(self = [super init]) {
puzzle = [[NSMutableArray alloc] initWithArray: puzzleArray];
}
return self;
}
그런 다음 퍼즐을 프리미티브 int 배열로 변환하여 해결 한 다음 퍼즐로 돌아갑니다. NSMutab leArray. 웃기는 것은 재미 있습니다. 이제는 그리드의 NSMutableArray에 솔루션이 있습니다. 즉, 어떻게 든 MESudokuSolver 내부에서 그리드의 배열이 수정되고 있음을 의미합니다. 그래서 몇 가지 조사를했는데 MESudokuSolver 인스턴스로 전달 된 배열에 대한 포인터는 MESudokuSolver의 NSMutableArray 퍼즐과 다릅니다. 이상하지? 알아.
추가 조사를 통해 다른 포인터가있는 배열 내부의 NSNumber에 대한 포인터는 실제로 동일합니다.
당신에게 StackOverflow, 나는 WTF를 묻는가?
감사합니다. 전에 실제로 다차원 NSArrays로 작업 한 적이 없기 때문에 이전에는이 문제가 실제로 발생하지 않았습니다. 여기에 명확한 질문을 할 수 있다면 ... 왜 1 차원 배열이 ... NSStrings라고하면 그 문자열이 실제로 메모리에 복사되고 다른 인스턴스에서 직접 수정되지 않는다는 것입니까? –
@Matt Egan : 당신이 무슨 뜻인지 정확히 모르겠습니다. 당신이 불변의 문자열 배열을 가지고 있다면, 아마도 메모리에 복사되지 않을 것입니다. 불변의 문자열을 수정할 수있는 것은 없으므로'copy'는 간단한'retain'이됩니다. 불변의 캐릭터 라인을 포함한 배열의 카피를 작성하면, 양쪽 모두의 배열에, 같은 불변 인 캐릭터 라인에의 참조가 포함됩니다. 개체를 수정할 때 걱정할 필요가있는 유일한 경우는 배열에 * 변경 가능한 * 개체가있는 경우입니다. 객체가 변경 가능하게 유지되기를 원하지만 다른 객체를 변경하지 않으려면'mutableCopy'를 얻어야합니다. – dreamlax
그것은 총체적인 감각을 다시 만든다! –