2011-10-03 4 views

답변

1

NSUserDefaults은 설정에 적합한 위치이지만 게임을 저장하지는 못합니다.

이점은 메모리 내 캐싱과 그 뒤에 수십 년간 안정성이 있다는 것입니다. 단점은 사용자 기본값 파일 (오브젝트는 plist- 친숙한 문자열, 숫자, 데이터, 날짜, 사전 및 배열에만 해당)에 넣을 수있는 범위가 상당히 제한된다는 것입니다. 또한 게임 상태를 NSUserDefaults에 저장하면 여러 저장 게임을 처리하기가 더 어려워집니다.

로직 클래스를 빌드하여 임의의 바이트 스트림으로 직렬화/비 직렬화 할 수 있도록하는 것이 좋습니다. 가장 쉬운 방법은 다양한 게임 상태 클래스에 NSCoding을 구현하는 것입니다. (예 : NSUserDefaults의 "quicksave"카피와 [yourapp]/Documents/의 full savegames의리스트) 인코딩/디코딩의 임무는 실제로 스토리지/검색 작업과 강하게 관련이있는 것은 아닙니다.

+0

실제로 Info.plist에서 ' UIFileSharingEnabled'을 설정하면 문서 디렉토리를 피할 수 있습니다. NSKeyedArchiver를 사용하여 NSCoding을 따르는 객체를 직렬화하려는 경우 결과 NSData를 NSUserDefaults에 넣을 수 있습니다. "적절하지"않을 수도 있지만 확실히 쉽습니다. (매우 효율적이지는 않지만, NSUserDefaults에 배열을 고정하여 여러 개의 저장된 파일 이름을 처리 할 수도 있습니다!) –

+0

1) 'UIFileSharingEnabled' 키를 ​​인식합니다. 그것은 단지 예일뿐 아니라 사용자가 savegames를 백업 할 수있게하는 데 가치가있을 수 있습니다. 2) 또한 'NSCoder'객체를 사용하여 임의의 데이터를 plist 친숙한 'NSData' 객체로 변환 할 수 있음을 알고 있습니다. 그건 사실 내 요점이었습니다. :) –

+0

게임에 따라 사용자가 임의로 저장된 게임 (즉, 치트!)을 쉽게로드 할 수 없도록하려는 경우가 있습니다 (특히 점수가 높은 경우). 물론, 이것은 여전히 ​​아이폰 백업을 편집하여 할 수 있지만, 장벽은 * 약간 * 높습니다. –

5

NSUserDefaults의 가장 큰 장점은 "디스크"에 대한 실제 작성에 대해 걱정할 필요가 없다는 것입니다. — -synchronize은 "적절한 시간"에 자동으로 호출됩니다. inc ludes 앱 배경 (멀티 태스킹이 지원되는 경우) 또는 종료 (멀티 태스킹이 지원되지 않거나 UIApplicationExitsOnSuspend 또는 호출 된 항목을 설정하는 경우). 즉, NSUserDefaults를 훨씬 더 자주 오버 헤드없이 업데이트 할 수 있습니다.

단점은 모든 것이 메모리에로드되고 쓰기가 전체 파일을 작성하는 것입니다 (임시 파일에 쓰고 이름을 변경한다고 생각합니다). 따라서 적합하지 않습니다. 드물게 변화하는 큰 얼룩 (예 : 사진)을 저장합니다.

저장된 게임이 큰 경우가 아니라면 NSUserDefaults로 간단하게 뭔가를 할 것입니다. 대개 파일 묶음을 추적하지 않아도됩니다.

편집 : NSUserDefaults에 잠재적으로 큰 단점은 응용 프로그램 충돌, 그래서 당신은 아직도 가끔 명시 적으로 -synchronize을 할 수 있습니다 때 앱이 얼마나 crashy에 따라 저장하지 않습니다이다. Xcode에서 "stop"을 누르거나 디버깅하는 동안 전화기를 뽑아내는 것이 효과적으로 충돌하는 것이므로 개발자에게 특히 주목할 가치가 있습니다!

관련 문제