NSUserDefaults
The NSUserDefaults class provides a programmatic interface for interacting with the defaults system. The defaults system allows an application to customize its behavior to match a user’s preferences. For example, you can allow users to determine what units of measurement your application displays or how often documents are automatically saved. Applications record such preferences by assigning values to a set of parameters in a user’s defaults database. The parameters are referred to as defaults since they’re commonly used to determine an application’s default state at startup or the way it acts by default.
At runtime, you use an NSUserDefaults object to read the defaults that your application uses from a user’s defaults database. NSUserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. The synchronize method, which is automatically invoked at periodic intervals, keeps the in-memory cache in sync with a user’s defaults database.
The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Booleans, and URLs. A default object must be a property list, that is, an instance of (or for collections a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of NSData. For more details, see Preferences and Settings Programming Guide.
Values returned from NSUserDefaults are immutable, even if you set a mutable object as the value. For example, if you set a mutable string as the value for "MyStringDefault", the string you later retrieve using stringForKey: will be immutable.
A defaults database is created automatically for each user. The NSUserDefaults class does not currently support per-host preferences. To do this, you must use the CFPreferences API (see Preferences Utilities Reference). However, NSUserDefaults correctly reads per-host preferences, so you can safely mix CFPreferences code with NSUserDefaults code.
If your application supports managed environments, you can use an NSUserDefaults object to determine which preferences are managed by an administrator for the benefit of the user. Managed environments correspond to computer labs or classrooms where an administrator or teacher may want to configure the systems in a particular way. In these situations, the teacher can establish a set of default preferences and force those preferences on users. If a preference is managed in this manner, applications should prevent users from editing that preference by disabling any appropriate controls.
The NSUserDefaults class is thread-safe.
Persistence of NSURL and file reference URLs
When using NSURL instances to refer to files within a process, it's important to make the distinction between location-based tracking (file: scheme URLs that are basically paths) versus filesystem identity tracking (file: scheme URLs that are file reference URLs). When persisting an NSURL, you should take that behavior into consideration. If your application tracks the resource being located by its identity so that it can be found if the user moves the file, then you should explicitly write the NSURL's bookmark data or encode a file reference URL.
If you want to track a file by reference but you require explicit control over when resolution occurs, you should take care to write out bookmark data to NSUserDefaults rather than rely on -[NSUserDefaults setURL:forKey:]. This allows you to call +[NSURL URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:] at a time when you know your application will be able to handle the potential I/O or required user interface interactions.
Sandbox Considerations
A sandboxed app cannot access or modify the preferences for any other app. (For example, if you add another app's domain using the addSuiteNamed: method, you do not gain access to that app's preferences.)
Attempting to access or modify another app's preferences does not result in an error, but when you do, OS X actually reads and writes files located within your app's container, rather than the actual preference files for the other application.
-
Returns the shared defaults object.
Declaration
Swift
class func standardUserDefaults() -> NSUserDefaultsObjective-C
+ (NSUserDefaults *)standardUserDefaultsReturn Value
The shared defaults object.
Discussion
If the shared defaults object does not exist yet, it is created with a search list containing the names of the following domains, in this order:
NSArgumentDomain, consisting of defaults parsed from the application’s argumentsA domain identified by the application’s bundle identifier
NSGlobalDomain, consisting of defaults meant to be seen by all applicationsSeparate domains for each of the user’s preferred languages
NSRegistrationDomain, a set of temporary defaults whose values can be set by the application to ensure that searches will always be successful
The defaults are initialized for the current user. Subsequent modifications to the standard search list remain in effect even when this method is invoked again—the search list is guaranteed to be standard only the first time this method is invoked.
Availability
Available in iOS 2.0 and later.
-
Synchronizes any changes made to the shared user defaults object and releases it from memory.
Declaration
Swift
class func resetStandardUserDefaults()Objective-C
+ (void)resetStandardUserDefaultsDiscussion
A subsequent invocation of
standardUserDefaultscreates a new shared user defaults object with the standard search list.Availability
Available in iOS 2.0 and later.
-
Returns an
NSUserDefaultsobject initialized with the defaults for the current user account.Declaration
Swift
convenience init()Objective-C
- (instancetype)initReturn Value
An initialized
NSUserDefaultsobject whose argument and registration domains are already set up.Discussion
This method does not put anything in the search list. Invoke it only if you’ve allocated your own
NSUserDefaultsinstance instead of using the shared one.Availability
Available in iOS 2.0 and later.
See Also
-
- initWithUser:(iOS 7.0)Returns an
NSUserDefaultsobject initialized with the defaults for the specified user account.Deprecation Statement
This method was never implemented to return anything but the defaults for the current user. Use
standardUserDefaultsinstead.Declaration
Objective-C
- (id)initWithUser:(NSString *)usernameParameters
usernameThe name of the user account.
Return Value
An initialized
NSUserDefaultsobject whose argument and registration domains are already set up. If the current user does not have access to the specified user account, this method returnsnil.Discussion
This method does not put anything in the search list. Invoke it only if you’ve allocated your own
NSUserDefaultsinstance instead of using the shared one.You do not normally use this method to initialize an instance of
NSUserDefaults. Applications used by a superuser might use this method to update the defaults databases for a number of users. The user who started the application must have appropriate access (read, write, or both) to the defaults database of the new user, or this method returnsnil.Special Considerations
This method was never implemented to do anything except return the defaults for the current user.
Availability
Available in iOS 2.0 and later.
Deprecated in iOS 7.0.
See Also
-
init(suiteName:) - initWithSuiteName:Designated InitializerReturns an
NSUserDefaultsobject initialized with the defaults for the specified app group.Declaration
Swift
init?(suiteNamesuitename: String?)Objective-C
- (instancetype)initWithSuiteName:(NSString *)suitenameParameters
suitenameThe name of the app group.
If you pass
nilto this parameter, the system uses the default search list that thestandardUserDefaultsclass method uses.Return Value
An initialized
NSUserDefaultsobject whose argument and registration domains are already set up.Discussion
Use this method in scenarios such as:
When developing an app suite, to share preferences or other data among the apps
When developing an app extension, to share preferences or other data between the extension and its containing app
Availability
Available in iOS 7.0 and later.
-
Adds the contents of the specified dictionary to the registration domain.
Declaration
Objective-C
- (void)registerDefaults:(NSDictionary<NSString *,id> *)dictionaryParameters
dictionaryThe dictionary of keys and values you want to register.
Discussion
If there is no registration domain, one is created using the specified dictionary, and
NSRegistrationDomainis added to the end of the search list.The contents of the registration domain are not written to disk; you need to call this method each time your application starts. You can place a plist file in the application's Resources directory and call
registerDefaults:with the contents that you read in from that file.Availability
Available in iOS 2.0 and later.
-
Returns the array associated with the specified key.
Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
The array associated with the specified key, or
nilif the key does not exist or its value is not anNSArrayobject.Special Considerations
The returned array and its contents are immutable, even if the values you originally set were mutable.
Availability
Available in iOS 2.0 and later.
See Also
-
Returns the Boolean value associated with the specified key.
Declaration
Objective-C
- (BOOL)boolForKey:(NSString *)defaultNameParameters
defaultNameA key in the current user's defaults database.
Return Value
If a boolean value is associated with
defaultNamein the user defaults, that value is returned. Otherwise,NOfalseis returned.Availability
Available in iOS 2.0 and later.
See Also
-
Returns the data object associated with the specified key.
Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
The data object associated with the specified key, or
nilif the key does not exist or its value is not anNSDataobject.Special Considerations
The returned data object is immutable, even if the value you originally set was a mutable data object.
Availability
Available in iOS 2.0 and later.
See Also
-
Returns the dictionary object associated with the specified key.
Declaration
Objective-C
- (NSDictionary<NSString *,id> *)dictionaryForKey:(NSString *)defaultNameParameters
defaultNameA key in the current user's defaults database.
Return Value
The dictionary object associated with the specified key, or
nilif the key does not exist or its value is not anNSDictionaryobject.Special Considerations
The returned dictionary and its contents are immutable, even if the values you originally set were mutable.
Availability
Available in iOS 2.0 and later.
See Also
-
Returns the floating-point value associated with the specified key.
Declaration
Objective-C
- (float)floatForKey:(NSString *)defaultNameParameters
defaultNameA key in the current user's defaults database.
Return Value
The floating-point value associated with the specified key. If the key does not exist, this method returns
0.Availability
Available in iOS 2.0 and later.
See Also
-
Returns the integer value associated with the specified key..
Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
The integer value associated with the specified key. If the specified key does not exist, this method returns
0.Availability
Available in iOS 2.0 and later.
See Also
-
Returns the object associated with the first occurrence of the specified default.
Declaration
Objective-C
- (id)objectForKey:(NSString *)defaultNameParameters
defaultNameA key in the current user's defaults database.
Return Value
The object associated with the specified key, or
nilif the key was not found.Discussion
This method searches the domains included in the search list in the order they are listed.
Special Considerations
The returned object is immutable, even if the value you originally set was mutable.
Availability
Available in iOS 2.0 and later.
-
Returns the array of strings associated with the specified key.
Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
The array of
NSStringobjects, ornilif the specified default does not exist, the default does not contain an array, or the array does not containNSStringobjects.Special Considerations
The returned array and its contents are immutable, even if the values you originally set were mutable.
Availability
Available in iOS 2.0 and later.
See Also
-
Returns the string associated with the specified key.
Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
For string values, the string associated with the specified key. For number values, the string value of the number. Returns
nilif the default does not exist or is not a string or number value.Special Considerations
The returned string is immutable, even if the value you originally set was a mutable string.
Availability
Available in iOS 2.0 and later.
See Also
-
Returns the double value associated with the specified key.
Declaration
Objective-C
- (double)doubleForKey:(NSString *)defaultNameParameters
defaultNameA key in the current user's defaults database.
Return Value
The double value associated with the specified key. If the key does not exist, this method returns
0.Availability
Available in iOS 2.0 and later.
See Also
-
Returns the
NSURLinstance associated with the specified key.Declaration
Parameters
defaultNameA key in the current user's defaults database.
Return Value
The
NSURLinstance value associated with the specified key. If the key does not exist, this method returnsnil.Discussion
When an NSURL is read using -[NSUserDefaults URLForKey:], the following logic is used:
If the value for the key is an
NSData, theNSDatais used as the argument to+[NSKeyedUnarchiver unarchiveObjectWithData:]. If theNSDatacan be unarchived as an NSURL, the NSURL is returned otherwise nil is returned.If the value for this key was a file reference URL, the file reference URL will be created but its bookmark data will not be resolved until the NSURL instance is later used (e.g. at
-[NSData initWithContentsOfURL:]).If the value for the key is an NSString which begins with a ~, the NSString will be expanded using
-[NSString stringByExpandingTildeInPath]and a file: scheme NSURL will be created from that.
Availability
Available in iOS 4.0 and later.
See Also
-
Sets the value of the specified default key to the specified Boolean value.
Declaration
Objective-C
- (void)setBool:(BOOL)valueforKey:(NSString *)defaultNameParameters
valueThe Boolean value to store in the defaults database.
defaultNameThe key with which to associate with the value.
Discussion
Invokes
setObject:forKey:as part of its implementation.Availability
Available in iOS 2.0 and later.
See Also
-
Sets the value of the specified default key to the specified floating-point value.
Declaration
Objective-C
- (void)setFloat:(float)valueforKey:(NSString *)defaultNameParameters
valueThe floating-point value to store in the defaults database.
defaultNameThe key with which to associate with the value.
Discussion
Invokes
setObject:forKey:as part of its implementation.Availability
Available in iOS 2.0 and later.
See Also
-
Sets the value of the specified default key to the specified integer value.
Declaration
Parameters
valueThe integer value to store in the defaults database.
defaultNameThe key with which to associate with the value.
Discussion
Invokes
setObject:forKey:as part of its implementation.Availability
Available in iOS 2.0 and later.
See Also
-
Sets the value of the specified default key in the standard application domain.
Declaration
Objective-C
- (void)setObject:(id)valueforKey:(NSString *)defaultNameParameters
valueThe object to store in the defaults database.
defaultNameThe key with which to associate with the value.
Discussion
The
valueparameter can be only property list objects:NSData,NSString,NSNumber,NSDate,NSArray, orNSDictionary. ForNSArrayandNSDictionaryobjects, their contents must be property list objects. See What is a Property List? in Property List Programming Guide.Setting a default has no effect on the value returned by the
objectForKey:method if the same key exists in a domain that precedes the application domain in the search list.Availability
Available in iOS 2.0 and later.
See Also
-
Sets the value of the specified default key to the double value.
Declaration
Objective-C
- (void)setDouble:(double)valueforKey:(NSString *)defaultNameParameters
valueThe double value.
defaultNameThe key with which to associate with the value.
Availability
Available in iOS 2.0 and later.
-
Sets the value of the specified default key to the specified URL.
Declaration
Parameters
urlThe
NSURLto store in the defaults database.defaultNameThe key with which to associate with the value.
Discussion
When an NSURL is stored using -[NSUserDefaults setURL:forKey:], some adjustments are made:
Any non-file URL is written by calling
+[NSKeyedArchiver archivedDataWithRootObject:]using the NSURL instance as the root object.Any file reference
file:scheme URL will be treated as a non-file URL, and information which makes this URL compatible with 10.5 systems will also be written as part of the archive as well as its minimal bookmark data.Any path-based file: scheme URL is written by first taking the absolute URL, getting the path from that and then determining if the path can be made relative to the user's home directory. If it can, the string is abbreviated by using
stringByAbbreviatingWithTildeInPathand written out. This allows pre-10.6 clients to read the default and use-[NSString stringByExpandingTildeInPath]to use this information.
Availability
Available in iOS 4.0 and later.
See Also
-
Removes the value of the specified default key in the standard application domain.
Declaration
Swift
func removeObjectForKey(_defaultName: String)Objective-C
- (void)removeObjectForKey:(NSString *)defaultNameParameters
defaultNameThe key whose value you want to remove.
Discussion
Removing a default has no effect on the value returned by the
objectForKey:method if the same key exists in a domain that precedes the standard application domain in the search list.Availability
Available in iOS 2.0 and later.
See Also
-
Writes any modifications to the persistent domains to disk and updates all unmodified persistent domains to what is on disk.
Return Value
YEStrueif the data was saved successfully to disk, otherwiseNOfalse.Discussion
Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes.
Availability
Available in iOS 2.0 and later.
-
Returns a dictionary containing the keys and values in the specified persistent domain.
Declaration
Objective-C
- (NSDictionary<NSString *,id> *)persistentDomainForName:(NSString *)domainNameParameters
domainNameThe domain whose keys and values you want.
Return Value
A dictionary containing the keys. The keys are names of defaults and the value corresponding to each key is a property list object (
NSData,NSString,NSNumber,NSDate,NSArray, orNSDictionary).Availability
Available in iOS 2.0 and later.
-
- persistentDomainNames(iOS 7.0)Returns an array of the current persistent domain names.
Deprecation Statement
Instead of using this method, you should track the domains you add if you want to later retrieve them with
persistentDomainForName:.Declaration
Objective-C
- (NSArray *)persistentDomainNamesReturn Value
An array of
NSStringobjects containing the domain names.Discussion
You can get the keys and values for each domain by passing the returned domain names to the
persistentDomainForName:method.Availability
Available in iOS 2.0 and later.
Deprecated in iOS 7.0.
-
Removes the contents of the specified persistent domain from the user’s defaults.
Declaration
Swift
func removePersistentDomainForName(_domainName: String)Objective-C
- (void)removePersistentDomainForName:(NSString *)domainNameParameters
domainNameThe domain whose keys and values you want.
Discussion
When a persistent domain is changed, an
NSUserDefaultsDidChangeNotificationis posted.Availability
Available in iOS 2.0 and later.
-
Sets the dictionary for the specified persistent domain.
Declaration
Objective-C
- (void)setPersistentDomain:(NSDictionary<NSString *,id> *)domainforName:(NSString *)domainNameParameters
domainThe dictionary of keys and values you want to assign to the domain.
domainNameThe domain whose keys and values you want to set. This value should be equal to your application's bundle identifier.
Discussion
When a persistent domain is changed, an
NSUserDefaultsDidChangeNotificationis posted.Availability
Available in iOS 2.0 and later.
-
Returns a Boolean value indicating whether the specified key is managed by an administrator.
Declaration
Objective-C
- (BOOL)objectIsForcedForKey:(NSString *)keyParameters
keyThe key whose status you want to check.
Return Value
YEStrueif the value of the specified key is managed by an administrator, otherwiseNOfalse.Discussion
This method assumes that the key is a preference associated with the current user and application. For managed keys, the application should disable any user interface that allows the user to modify the value of
key.Availability
Available in iOS 2.0 and later.
See Also
-
Returns a Boolean value indicating whether the key in the specified domain is managed by an administrator.
Declaration
Parameters
keyThe key whose status you want to check.
domainThe domain of the key.
Return Value
YEStrueif the key is managed by an administrator in the specified domain, otherwiseNOfalse.Discussion
This method assumes that the key is a preference associated with the current user. For managed keys, the application should disable any user interface that allows the user to modify the value of
key.Availability
Available in iOS 2.0 and later.
See Also
-
Returns a dictionary that contains a union of all key-value pairs in the domains in the search list.
Declaration
Objective-C
- (NSDictionary<NSString *,id> *)dictionaryRepresentationReturn Value
A dictionary containing the keys. The keys are names of defaults and the value corresponding to each key is a property list object (
NSData,NSString,NSNumber,NSDate,NSArray, orNSDictionary).Discussion
As with
objectForKey:, key-value pairs in domains that are earlier in the search list take precedence. The combined result does not preserve information about which domain each entry came from.Availability
Available in iOS 2.0 and later.
-
Removes the specified volatile domain from the user’s defaults.
Declaration
Swift
func removeVolatileDomainForName(_domainName: String)Objective-C
- (void)removeVolatileDomainForName:(NSString *)domainNameParameters
domainNameThe volatile domain you want to remove.
Availability
Available in iOS 2.0 and later.
See Also
-
Sets the dictionary for the specified volatile domain.
Declaration
Objective-C
- (void)setVolatileDomain:(NSDictionary<NSString *,id> *)domainforName:(NSString *)domainNameParameters
domainThe dictionary of keys and values you want to assign to the domain.
domainNameThe domain whose keys and values you want to set.
Discussion
This method raises an
NSInvalidArgumentExceptionif a volatile domain with the specified name already exists.Availability
Available in iOS 2.0 and later.
-
Returns the dictionary for the specified volatile domain.
Declaration
Objective-C
- (NSDictionary<NSString *,id> *)volatileDomainForName:(NSString *)domainNameParameters
domainNameThe domain whose keys and values you want.
Return Value
The dictionary of keys and values belonging to the domain. The keys in the dictionary are names of defaults, and the value corresponding to each key is a property list object (
NSData,NSString,NSNumber,NSDate,NSArray, orNSDictionary).Availability
Available in iOS 2.0 and later.
-
volatileDomainNames volatileDomainNamesPropertyThe current volatile domain names. (read-only)
Declaration
Swift
var volatileDomainNames: [String] { get }Objective-C
@property(readonly, copy) NSArray <NSString *> *volatileDomainNamesDiscussion
The domain names are represented as strings. You can get the contents of each domain by passing the returned domain names to the
volatileDomainForName:method.Availability
Available in iOS 2.0 and later.
-
Inserts the specified domain name into the receiver’s search list.
Declaration
Swift
func addSuiteNamed(_suiteName: String)Objective-C
- (void)addSuiteNamed:(NSString *)suiteNameParameters
suiteNameThe domain name to insert. This domain is inserted after the application domain.
Discussion
The
suiteNamedomain is similar to a bundle identifier string, but is not necessarily tied to a particular application or bundle. A suite can be used to hold preferences that are shared between multiple applications.Searches of preferences tied to a suite follow the normal pattern, searching first for current user, current host, then
Availability
Available in iOS 2.0 and later.
-
These constants specify various user defaults domains.
Declaration
Objective-C
extern NSString *NSGlobalDomain; extern NSString *NSArgumentDomain; extern NSString *NSRegistrationDomain;Constants
-
NSGlobalDomainNSGlobalDomainThe domain consisting of defaults meant to be seen by all applications.
Available in iOS 2.0 and later.
-
NSArgumentDomainNSArgumentDomainThe domain consisting of defaults parsed from the application’s arguments. These are one or more pairs of the form -default value included in the command-line invocation of the application.
Available in iOS 2.0 and later.
-
NSRegistrationDomainNSRegistrationDomainThe domain consisting of a set of temporary defaults whose values can be set by the application to ensure that searches will always be successful.
Available in iOS 2.0 and later.
-
-
This notification is posted when a change is made to defaults in a persistent domain.
The notification object is the
NSUserDefaultsobject. This notification does not contain auserInfodictionary.Declaration
Swift
let NSUserDefaultsDidChangeNotification: StringImport Statement
Objective-C
@import Foundation;Swift
import FoundationAvailability
Available in iOS 2.0 and later.
Copyright © 2015 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2014-09-17
