NSUserDefaults removeObjectForKey 대 setObject : nil


116

다음 두 줄은 동일합니까?

1. [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"example key"]

2. [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"example key"]


1
예, 첫 번째가 당신의 의도를 훨씬 더 명확하게하는 것을 제외하고는.
BallpointBen

답변:


14

스위프트 3.0

아래 답변은 내가 이것을 테스트했을 때 더 이상 그렇지 않습니다. nil결과로 설정되면 NSCFData가 저장됩니다. NSNull 개체 참조 일 수 있지만 긍정적 인 것은 아닙니다.

키 사용 값을 완전히 제거하려면 UserDefaults.standard.removeObject(forKey: "YourDefault")

다음 코드로 테스트했습니다.

UserDefaults.standard.set(["a", "b", "c"], forKey: "MyDefaults")
print("Test A: My saved defaults \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.set(nil, forKey: "MyDefaults")
print("Test B: My defaults set to nil \(UserDefaults.standard.object(forKey: "MyDefaults"))")

UserDefaults.standard.removeObject(forKey: "MyDefaults")
print("Test C: My defaults removed \(UserDefaults.standard.object(forKey: "MyDefaults"))")

흥미롭게도 Swift에서 set (nil, forKey : ...)를 입력하고 "jump to definition"을 사용하면 URL setter로 이동합니다. 해당 함수에 대한 주석은 "-setURL : forKey는 값이 NSData에 아카이브된다는 점을 제외하면 -setObject : forKey :와 동일합니다."라고 말합니다. 이것은 오작동하는 이유를 설명 할 수 있습니다. nil을 허용하는 두 개의 오버로드 된 함수가 있기 때문에 Swift는 하나를 선택해야하지만 setURL은 동일하게 작동하지 않습니다.
Richard Venable

96

예, 두 줄의 코드는 동일합니다. 둘 다 읽기가 없습니다.

id obj = [[NSUserDefaults standardUserDefaults] objectForKey:@"example key"];

NSUserDefaults키를 찾을 수 없으면 nil을 반환합니다. removeObjectForKeynil로 설정하는 대신를 사용하는 것이 좋습니다 .

여기에 키 값을 nil로 설정하여 키 항목이에서 제거되었는지 테스트하는 방법이 있습니다 NSUserDefaults standardUserDefaults.

NSArray *keys = [[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] copy];
   for(NSString *key in keys) {
       NSLog(@"Key Name: %@", key);
}
[keys release];

또는 단순히 키 / 값 사전을 덤프 NSUserDefaults standardUserDefaults

NSLog(@"All contents of NSUserDefaults: %@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);

예,하지만 nil로 설정하면 자동으로 수행 removeObjectForKey됩니까?
ma11hew28

'nil'로 설정하면 [NSUserDefaults standardUserDefaults]의 키 항목이 제거되는지 확실하지 않습니다. 빠른 테스트는 'allKeys'[[NSUserDefaults standardUserDefaults] allKeys]를 가져 와서 키 이름의 NSArrya를 반복하여 키를 nil로 설정하면 'allKey'배열에서 키가 제거되는지 확인하는 것입니다.
RocketMan

9
결과는 '예'입니다. 'removeObjectForKey'와 'setObject : nil'모두 [NSUserDefaults standardUserDefaults]에서 @ "example key"키를 제거합니다.
RocketMan

9
감사! 이것도 확인했습니다. 명확히하기 위해 setObject:nil키뿐만 아니라 객체도 제거합니다. 따라서 두 함수 모두 정확히 동일한 결과를 발생시킵니다. 또한 저장된 객체 (및 키) 만 제거 (또는 nil로 설정)하면 전체 .plist 파일이 삭제됩니다.
ma11hew28

1

Swift 5.0 + iOS 11 이상

두 방법 모두 값을 제거합니다. 놀이터에서 이것을 시도했습니다.

import Foundation

let key = "Test"
let value = "test"
let defaults = UserDefaults.standard

func printUD() {
    print("UserDefaults after modification:\n")
    defaults.dictionaryRepresentation().forEach { print("\($0): \($1)\n") }
    print("-------------\n\n")
}

defaults.set(value, forKey: key); printUD()
defaults.set(nil, forKey: key); printUD()
defaults.set(value, forKey: key); printUD()
defaults.removeObject(forKey: key); printUD()

iOS 11 이전에는 이로 인해 직렬화 nil되고 Data오류가 발생합니다.

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