출처 : 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를 만들어서 숨김폴더에 넣어서 관리하는게 낫다고 생각한다.
이 경우는 직접 파일을 읽고 쓰는 것이기 때문에 위와 같은 캐시 문제가 발생하지 않는다.
'Mac' 카테고리의 다른 글
dylib파일을 RTLD_LAZY 모드로 dlopen 할 때 주의점 (0) | 2018.06.12 |
---|---|
맥용 디스크 관리 유틸리티 Disk Inventory X (0) | 2018.03.03 |
Paste2 할인중 (0) | 2017.11.23 |
XCode 구버전 받으려면 (0) | 2017.11.21 |
드디어 High Sierra 로 업데이트 (0) | 2017.11.20 |