Foundation Release Notes For iOS
Overview
macOS 10.14
,iOS 12
,watchOS 5
和tvOS 12
中的基础包括新功能,API更改和弃用。
Secure Data Archival and Unarchival
NSKeyedArchiver
和NSKeyedUnarchiver
类具有新的初始化器和辅助方法,使您可以更轻松地为存档和取消存档启用安全编码。 每个初始化程序或帮助程序方法都会替换现在不推荐使用的相应成员。
-
init(requiresSecureCoding :)
替换init()
和init(forWritingWith :)
。 -
archivedData(withRootObject:requiresSecureCoding :)
取代了archivedData(withRootObject :)
和archiveRootObject(_:toFile :)
。 -
init(forReadingFrom :)
替换init()
和init(forReadingWith :)
。 -
unarchivedObject(ofClass:from :)
和unarchivedObject(ofClasses:from :)
替换unarchiveObject(with:)
,unarchiveTopLevelObjectWithData(_ :)
和unarchiveObject(withFile :)
。
在取消归档作为您提供的类列表之一的子类的实例时,可以使用新的unarchivedObject(ofClasses:from :)
方法。 您可以在与macOS 10.13
,iOS 11
,watchOS 4
,tvOS 11
以及每个操作系统的后续版本兼容的应用程序中使用这些初始化程序和帮助程序方法。
Secure Value Transformer
NSSecureUnarchiveFromDataTransformer
是ValueTransformer
的新子类。它使用NSKeyedArchiver
和NSKeyedUnarchiver
通过启用requiresSecureCoding
来归档和取消归档数据。
从NSData``取消归档时,
NSSecureUnarchiveFromDataTransformer使用其的
allowedTopLevelClasses列表通过调用新的
unarchivedObject(ofClasses:from :)方法来解码对象。默认情况下,此列表包括所有属性列表类型-
NSArray,
NSDictionary,
NSString,
NSNumber,
NSDate,
NSData和
NSNull以及
NSURL和
NSUUID。 归档到
NSData时,此转换器调用新的
archivedData(withRootObject:requiresSecureCoding :)方法并启用
requiresSecureCoding。 要转换上面列出的默认值以外的类型的顶级值,请继承
NSSecureUnarchiveFromDataTransformer`。
- 如果您希望仅解码一个允许类型的顶级值,则覆盖
transformedValueClass()
以返回该类型。这样做会自动填充allowedTopLevelClasses
。 - 如果您希望解码几个允许类型之一的顶级值,请覆盖
allowedTopLevelClasses
以返回这些类型。
现在不推荐使用较旧的unarchiveFromDataTransformerName
和keyedUnarchiveFromDataTransformerName
值。
NSSecureCoding Conformance
NSPointerFunctions
,NSMapTable
和NSHashTable
类现在支持与NSSecureCoding
协议的有限一致性。 只要使用以下个性和内存类型配置它们,就可以安全地编码消耗指针功能的集合:
objectPersonality
objectPointerPersonality
strongMemory
weakMemory
copyIn(可选)
重要
弱值不会像预期的那样往返,除非你在unarchival期间在其他地方强烈引用它们。
Macro for Closed Enumerations
NS_CLOSED_ENUM
是用于声明枚举的新宏。 您仅将其用于保证永远不会获得其他案例的枚举。 通常,您确定不会出现新案例,因为您正在建模的枚举代表数学上完整的集合。ComparisonResult
现在采用NS_CLOSED_ENUM宏
。 它不会获得额外的情况。
重要
将枚举标记为已关闭后,添加新值将是二进制和源不兼容的更改。 如果您对将来获得私有或其他公共案例的枚举有任何疑问,请改用NS_ENUM
宏。
有关NS_CLOSED_ENUM
的信息,并在其与其他宏之间进行选择以分组常量
UserDefaults
UserDefaults
有几个错误修复和改进:
- 删除了同步要求。不再需要使用
synchronize()
,CFPreferencesAppSynchronize(_ :)
或CFPreferencesSynchronize(_:_:_ :)
。这些方法将在操作系统的未来版本中弃用。
现在不需要调用这些同步方法,UserDefaults
和Preferences Utilities
的性能特征略有不同:排队写入操作所花费的时间现在由写入线程支付,而不是由下一个调用synchronize( )
或进行读操作。 - 添加观察者时删除了保留。使用
addObserver(_:forKeyPath:options:context :)
方法向UserDefaults
实例添加观察者无意中保留了它,与键值观察的所有其他用法不同。这已得到纠正,现在遵循正常的Cocoa
内存管理规则。 - 修复了
UserDefaults
中的键值观察错误。读取一个线程上的默认值,而另一个线程集默认值可以不确定地在两个线程上发送键值观察通知,而不仅仅是执行set
操作的线程。这已经修复了。
On-Demand Resources
遇到某些类型的内部错误时,NSBundleResourceRequest
不再抛出异常。 相反,它在beginAccessingResources(completionHandler :)
方法的完成处理程序的error参数中返回一个错误。 除NSUserCancelledError
和网络相关错误外,该错误可能还包括NSFileReadUnknownError
和NSXPCConnectionInterrupted
错误。
如果您的应用在使用NSBundleResourceRequest
时遇到错误,请再次请求资源或向用户显示提示再次尝试。
Thread Safety of Bundles
Bundle
上的principalClass
属性包括新的线程安全性改进。 如果其他线程正在加载包的过程中,则访问属性块。 此操作允许属性在所有情况下都返回正确的值。
CFMessagePort
CFMessagePortSetName(_:_ :)
函数在macOS 10.14
,iOS 12
,watchOS 5
和tvOS 12
上或之后链接的应用程序中不执行任何操作。此API
将在以后的版本中弃用。
在早期版本的macOS
,iOS
,watchOS
和tvOS
上链接的应用程序中,如果消息端口已经通过CFMessagePortSetDispatchQueue(_:_:
已经拥有与其自身关联的调度队列),则CFMessagePortSetName(_:_ :)
函数不会执行任何操作。 )功能。 以前,此模式将导致未定义的行为。
在所有情况下,如果需要更改CFMessagePort
的名称,请使用CFMessagePortCreateLocal(_:_:_:_:_ :)
或CFMessagePortCreateRemote(_:_ :)
。