NSUserDefaults 지우기


답변:


514

다음과 같이 응용 프로그램의 영구 도메인을 제거 할 수 있습니다.

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

스위프트 3 이상에서 :

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

이것은 @samvermette의 답변과 비슷하지만 조금 더 깨끗한 IMO입니다.


감사합니다! 나중에 appDomain을 해제하는 것을 잊지 마십시오.
IcyBlueRose

15
@IcyBlueRose-bundleIdentifier는 init 또는 new로 시작하지 않기 때문에 자동 해제 된 객체이므로 과다 릴리스합니다.
Christopher Rogers

1
알다시피 감사합니다! 그러나 문자열 appDomain에 대해 이야기하고있었습니다. 그 자동차도 공개 되나요?
IcyBlueRose

2
@IcyBlueRose bundleIdentifier에 의해 반환 된 객체는 appDomain에 의해 참조 된 객체와 동일합니다.
Christopher Rogers

2
10.8에서 더 이상 작동하지 않는 것 같습니다. 누군가 이것이 작동하는지 확인할 수 있습니까? 여기 SO 관련 질문이 있습니다 : stackoverflow.com/questions/13595415/…
DaGaMs

102

이 코드는 기본값을 등록 도메인으로 재설정합니다.

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

즉, removeObjectForKey해당 앱에 등록한 모든 단일 키에 해당합니다.

이 Apple Developer Forums 스레드 에서 Ken Thomases의 크레딧 .


4
무리 감사. 왜 이렇게 [NSUserDefaults resetStandardUserDefaults]하지 않는가 .
jakeboxer

2
@ jboxer 방금 Apple 문서를 공부하고 resetStandardUserDefaults가 기본적으로 인 메모리 버퍼를 디스크로 플러시하고 깨끗하게 닦습니다. 따라서 다음에 값을 검색하려고하면 디스크에서 값을 가져와야합니다. Core Data의 NSManagedObjectContext도 유사한 "재설정"용어를 사용합니다.
크리스토퍼 로저스

2
죄송합니다. 디스크에 쓰지 않고 메모리 내 버퍼를 지 웁니다. 따라서 디스크와 동기화하기 전에 변경 한 내용은 손실됩니다.
Christopher Rogers

4
크리스토퍼, 아마도 상황이 바뀌 었더라도 거꾸로 가지고 있다고 생각합니다. resetStandardUserDefaults는 iOS에서 지금까지 본 가장 혼란스러운 이름의 통화입니다. Apple Docs는 "공유 사용자 기본 개체에 대한 변경 사항을 동기화하고 메모리에서 해제합니다"라고 말합니다. 실제로 flushAndReleaseStandardUserDefaults라고합니다. 방금이 전화에 걸려서 다른 사람이 화상을 입지 않도록하기 위해 이전 댓글에 댓글을 달려면 시간을 내고 있습니다 (이제 클라이언트에게 90 개의 앱을 업데이트해야 함).
Andy Dent

97

-사용해 보셨습니까 removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];

건배 매우 감사.
TonyNeallon

5
모든 기존 키의 객체를 제거 할 수있는 방법이 있습니까?
samvermette 2016 년

2
이것이 작동하는 것으로 이해하지만 defunctPreference가 일종의 시스템 정의 상수가 아닌 이유는 무엇입니까? 앞으로 언젠가는 작동을 멈출 수 있으리라 확신합니다.
David H

이후에 동기화해야합니까?
Travis M.

30

Swift의 답변은 다음과 같습니다.

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)

8
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)one-liner
Grace Shao

3
또는 더 안전한 :if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
Valentin Shergin

1
Grace 's oneliner의 스위프트 4 버전 :UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Carsten Hagemann

28

개발하는 동안 필요한 경우 시뮬레이터를 재설정하여 모든을 삭제할 수도 있습니다 NSUserDefaults.

iOS 시뮬레이터-> 컨텐츠 및 설정 재설정 ...

시뮬레이터의 모든 앱과 파일도 삭제됩니다.


15
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}

7

스위프트에서 :

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }

6

참고 :이 답변은 Swift에도 업데이트되었습니다.

한 줄로하는 것은 어떻습니까?

@Christopher Rogers의 답변을 확장-허용되는 답변.

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

예, 언젠가 필요할 수도 synchronize있습니다.

[[NSUserDefaults standardUserDefaults] synchronize];

이 작업을 수행하는 방법을 만들었습니다.

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

스위프트 ?

더 빠르고 쉽게.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
        standard.removePersistentDomain(forName: aValidIdentifier)
        standard.synchronize()
    }
}

그리고 사용법 :

UserDefaults.clean()

6

코드를 깨끗하게 만들 때 확장 기능을 좋아합니다.

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}

스위프트 5

extension UserDefaults {
    func clear() {
        guard let domainName = Bundle.main.bundleIdentifier else {
            return
        }
        removePersistentDomain(forName: domainName)
        synchronize()
    }
}


2

위의 모든 답변은 매우 관련이 있지만 누군가가 삭제 된 앱의 사용자 기본값을 재설정 할 수없는 경우 시뮬레이터의 콘텐츠 설정을 재설정하면 작동합니다.여기에 이미지 설명을 입력하십시오


2

그것은 버그 또는 다른 것이지만 removePersistentDomainForName모든 NSUserDefaults값 을 지우는 동안 작동하지 않습니다 .

따라서 더 나은 옵션은를 재설정하고 PersistentDomain다음과 같은 방법으로 수행 할 수 있다는 것입니다.

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)

1

@ folse의 답변을 확장하면 더 정확한 구현이 될 것이라고 믿습니다 ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... NSUserDefault의 permanentDomainForName : 메소드 호출. 문서 상태로 "지정된 영구 도메인의 키와 값을 포함하는 사전을 반환합니다." dictionaryRepresentation :을 호출하면 더 넓은 범위에 적용되는 다른 설정을 포함 할 수있는 사전을 반환합니다.

재설정 할 값을 필터링해야하는 경우 키를 반복하는 것이 좋습니다. 분명히, 응용 프로그램에 대한 모든 기본 사항을 고려하지 않고 원한다면 위에 게시 된 다른 방법 중 하나가 가장 효율적입니다.



0

이것을 시도하십시오, 그것은 나를 위해 일하고 있습니다.

한 줄의 코드

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.