更新到 macOS 后出现关于 "dynamic accessors failing" 的未知错误

Getting unknown error about "dynamic accessors failing" after updating to macOS

升级到 macOS Sierra (10.12) 和 Xcode 8.0 (8A218a) 后,我的 macOS/Cocoa 应用程序(用 Objective-C 编写)开始收到许多错误消息格式:

[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDInfo while resolving selector 'uniqueId' on class 'ABCDInfo'.  Did you remember to declare it @dynamic or @synthesized in the @implementation ?

[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDContact while resolving selector 'uniqueId' on class 'ABCDContact'.  Did you remember to declare it @dynamic or @synthesized in the @implementation ?

[error] warning: dynamic accessors failed to find @property implementation for 'uniqueId' for entity ABCDEmailAddress while resolving selector 'uniqueId' on class 'ABCDEmailAddress'.  Did you remember to declare it @dynamic or @synthesized in the @implementation ?

[error] warning: dynamic accessors failed to find @property implementation for 'address' for entity ABCDEmailAddress while resolving selector 'address' on class 'ABCDEmailAddress'.  Did you remember to declare it @dynamic or @synthesized in the @implementation ?

None 这是我的代码或来自我正在使用的第 3 方开发人员库的代码,并搜索这些变量名称(即:'uniqueId' 或 'ABCDInfo' ) 没有拉出任何东西,表明它不在我的项目中。

我看到这个问题也在 Apple 的开发者论坛上被报告了两次 (Issue 1 and Issue 2),但是这两个问题都没有得到解答

我的问题是:出现这些错误消息的原因是什么,我该如何解决? 它不会导致我的应用程序崩溃,但我宁愿找出并理解问题所在。

可能与此配置有关:

  • 您正在访问 AddressBook 框架,可能是 'implicit synthesized properties' ON 构建的。
  • 您的软件是在 'implicit synthesized properties' OFF
  • 的情况下构建的

首先让我们检查一下@synthesize 和@dynamic 是什么:

  • @synthesize 将为您的 属性
  • 生成 getter 和 setter 方法
  • @dynamic 告诉编译器 getter 和 setter 方法 不是由 class 本身实现的,而是由其他地方实现的(比如 superclass 或将在运行时提供)

Contacts 现在要求使用 mail/contact 框架的任何人都需要使用 uses-contacts 权利进行代码签名。

您需要通过授予 "Contacts access" 权利对您的应用进行沙箱化。警告仍将被记录,但这与 XCode 8 的另一个错误有关,该错误记录了很多无用的东西。

Apple 似乎将不再接受非沙盒应用访问通讯录(或位置或日历)。

要将您的应用沙箱化,请执行以下操作: 转到您的项目设置 > Select 您的应用程序 > 启用 App SandBox 然后 select 您正在使用的应用程序数据。