美文网首页iOS 开发交流
Foundation Release Notes For iOS

Foundation Release Notes For iOS

作者: Mr__Peng__ | 来源:发表于2018-12-03 17:00 被阅读19次
Overview

macOS 10.14iOS 12watchOS 5tvOS 12中的基础包括新功能,API更改和弃用。

Secure Data Archival and Unarchival

NSKeyedArchiverNSKeyedUnarchiver类具有新的初始化器和辅助方法,使您可以更轻松地为存档和取消存档启用安全编码。 每个初始化程序或帮助程序方法都会替换现在不推荐使用的相应成员。

  • 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.13iOS 11watchOS 4tvOS 11以及每个操作系统的后续版本兼容的应用程序中使用这些初始化程序和帮助程序方法。
Secure Value Transformer

NSSecureUnarchiveFromDataTransformerValueTransformer的新子类。它使用NSKeyedArchiverNSKeyedUnarchiver通过启用requiresSecureCoding来归档和取消归档数据。
NSData``取消归档时,NSSecureUnarchiveFromDataTransformer使用其的allowedTopLevelClasses列表通过调用新的unarchivedObject(ofClasses:from :)方法来解码对象。默认情况下,此列表包括所有属性列表类型-NSArrayNSDictionaryNSStringNSNumberNSDateNSDataNSNull以及NSURLNSUUID。 归档到NSData时,此转换器调用新的archivedData(withRootObject:requiresSecureCoding :)方法并启用requiresSecureCoding。 要转换上面列出的默认值以外的类型的顶级值,请继承NSSecureUnarchiveFromDataTransformer`。

  • 如果您希望仅解码一个允许类型的顶级值,则覆盖transformedValueClass()以返回该类型。这样做会自动填充allowedTopLevelClasses
  • 如果您希望解码几个允许类型之一的顶级值,请覆盖allowedTopLevelClasses以返回这些类型。
    现在不推荐使用较旧的unarchiveFromDataTransformerNamekeyedUnarchiveFromDataTransformerName值。
NSSecureCoding Conformance

NSPointerFunctionsNSMapTableNSHashTable类现在支持与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(_:_:_ :)。这些方法将在操作系统的未来版本中弃用。
    现在不需要调用这些同步方法,UserDefaultsPreferences Utilities的性能特征略有不同:排队写入操作所花费的时间现在由写入线程支付,而不是由下一个调用synchronize( )或进行读操作。
  • 添加观察者时删除了保留。使用addObserver(_:forKeyPath:options:context :)方法向UserDefaults实例添加观察者无意中保留了它,与键值观察的所有其他用法不同。这已得到纠正,现在遵循正常的Cocoa内存管理规则。
  • 修复了UserDefaults中的键值观察错误。读取一个线程上的默认值,而另一个线程集默认值可以不确定地在两个线程上发送键值观​​察通知,而不仅仅是执行set操作的线程。这已经修复了。
On-Demand Resources

遇到某些类型的内部错误时,NSBundleResourceRequest不再抛出异常。 相反,它在beginAccessingResources(completionHandler :)方法的完成处理程序的error参数中返回一个错误。 除NSUserCancelledError和网络相关错误外,该错误可能还包括NSFileReadUnknownErrorNSXPCConnectionInterrupted错误。
如果您的应用在使用NSBundleResourceRequest时遇到错误,请再次请求资源或向用户显示提示再次尝试。

Thread Safety of Bundles

Bundle上的principalClass属性包括新的线程安全性改进。 如果其他线程正在加载包的过程中,则访问属性块。 此操作允许属性在所有情况下都返回正确的值。

CFMessagePort

CFMessagePortSetName(_:_ :)函数在macOS 10.14iOS 12watchOS 5tvOS 12上或之后链接的应用程序中不执行任何操作。此API将在以后的版本中弃用。
在早期版本的macOSiOSwatchOStvOS上链接的应用程序中,如果消息端口已经通过CFMessagePortSetDispatchQueue(_:_:已经拥有与其自身关联的调度队列),则CFMessagePortSetName(_:_ :)函数不会执行任何操作。 )功能。 以前,此模式将导致未定义的行为。
在所有情况下,如果需要更改CFMessagePort的名称,请使用CFMessagePortCreateLocal(_:_:_:_:_ :)CFMessagePortCreateRemote(_:_ :)

相关文章

网友评论

    本文标题:Foundation Release Notes For iOS

    本文链接:https://www.haomeiwen.com/subject/ohaycqtx.html