본문 바로가기

Mac

Mac에서 ~/Library/Preferences/ 밑에 있는 plist 값을 직접 수정했는데 NSUserDefault 에서 cache된 값을 가져오는 문제

출처 : http://hints.macworld.com/article.php?story=20130908042828630


Mac에서는 NSUserDefault를 이용해서 Windows의 레지스트리 처럼 이용할 수 있다.

[[NSUserDefaults standardUserDefaults] setObject:@"Hello World" forKey:@"Test"];

[[NSUserDefaults standardUserDefaults] synchronize];

NSString* test = [[NSUserDefaults standardUserDefaults] stringForKey:@"Test"];

NSLog(@"test = %@", test);


이렇게 사용할 경우 ~/Library/Preferences/ 하위에 번들아이디명.plist 에 저장이 되는데, 

이 파일이 plist다 보니까 직접 수정을 할 수가 있다.

예를 들면 Installer를 만들 때 여기에 값을 남겨야 하는 경우가 발생할 수 있는데, 

이경우 NSUserDefaults를 사용할 수 가 없으므로 shell script 등을 이용해서 직접 plist 파일에 접근해서 쓰는 수 밖에 없다.

하지만 이렇게 할 경우 예상과 다르게 동작하는 경우가 있는데, 이유는 cache 때문이다.

Mac OS가 여기에 저장된 데이터를 캐시하고 있다가 전달하기 때문에, 

직접 plist 파일에 직접 접근해서 수정을 할 경우 

NSString* test = [[NSUserDefaults standardUserDefaults] stringForKey:@"Test"]; 

와 같이 사용할 경우, 

수정한 값이 아니라, 이전에 cache된 데이터가 넘어오는 경우가 자주 발생한다.


이경우 해결책은 강제로 그 파일을 쓰게하는 방법이 있다.

내가 찾은 출처에 나오는 방법은 

defaults read ~/Library/Preferences/번들아이디명.plist


이렇게 해서 강제로 쓰게 하면 이후에 정상적으로 불러 오는 것을 확인할 수 있다.

.sh 파일을 만들 경우 다음과 같이 추가해주면 된다.


/usr/bin/defaults write ~/Library/Preferences/com.my.app.plist Test "$1"

/usr/bin/defaults read ~/Library/Preferences/com.my.app.plist Test


이 경우 경로에 띄어쓰기가 없을 거라 이렇게 쓰긴 했는데, 습관적으로 따옴표를 붙여주는게 좋다.



PS.

사실 저렇게 해도 안되는 경우가 많은 것 같다.

 그래서 저기 값을 바꿔준 뒤에는 재부팅을 해 주는게 좋을 것 같다.

만약,자주 변경이 이루어져서 재부팅을 하기에 부담스럽다면?

그렇다면 UserDefault 를 쓰지 않고 직접 plist를 만들어서 숨김폴더에 넣어서 관리하는게 낫다고 생각한다. 

이 경우는 직접 파일을 읽고 쓰는 것이기 때문에 위와 같은 캐시 문제가 발생하지 않는다.